【问题标题】:Apparently contradictory behavior of Javascript functionJavascript函数的明显矛盾行为
【发布时间】:2011-09-11 11:16:26
【问题描述】:

“Doug Crockford: JavaScript: The Good Parts”提出的以下功能。效果很好。

var fibonacci = function () {
  var memo = [0, 1];
  var fib = function (c) {
    console.debug(memo, c, memo[c]);
    result = memo[c];
    if (typeof result !== 'number'){
      result = fib(c - 1) + fib(c - 2);
      memo[c] = result;
    }
    return result;
  };
  return fib;
}();

console.log(fibonacci(3));

但是让我们详细看看第 4 行发生了什么

console.debug(memo, c, memo[c]);

它显示了与预期相反的以下结果。

memo,        c, memo[c]
[0, 1, 1, 2] 3  undefined  //contradictory behavior because I expect to have memo = [0, 1]
[0, 1, 1, 2] 2  undefined  //contradictory behavior
[0, 1, 1, 2] 1  1
[0, 1, 1, 2] 0  0
[0, 1, 1, 2] 1  1
2

一些想法?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这是 Chrome 控制台输出的问题。 Chrome 似乎会以某种方式动态更新输出以反映数组的内容。如果在 Firebug 中运行,输出为:

    [0, 1]    3 undefined
    [0, 1]    2 undefined
    [0, 1]    1 1
    [0, 1]    0 0
    [0, 1, 1] 1 1
    2
    

    当您尝试在脑海中查看代码时,这也很有意义:console.debugfib 中的第一条语句。第一次调用fibmemo[0, 1],因为没有对数组进行任何更改。 c3,所以你得到 undefined。所以在第一次调用中,无论控制台显示什么,memo 都不能是[0, 1, 1, 2]

    当您记录对数组或对象的引用时,某些 JavaScript 控制台 seem to show such a behaviour(以一种或另一种方式)。在这些情况下,通常最好设置断点并逐步执行代码。

    更新:似乎 Firebug 修复了这个问题(如果它曾经存在的话),但它似乎仍然存在于 Firebug 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      相关资源
      最近更新 更多