Javascript函数的明显矛盾行为

Javascript函数的明显矛盾行为,javascript,Javascript,“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 -

“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

一些想法?

这是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.debug
fib
中的第一条语句。第一次调用
fib
时,
memo
[0,1]
,因为尚未对数组进行任何更改
c
3
,因此您得到
未定义的
。因此,在第一次调用中,
memo
不能是
[0,1,1,2]
,无论控制台显示什么

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


更新:Firebug似乎解决了这个问题(如果它曾经存在的话),但它似乎仍然存在于Firebug灯光下。

这是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.debug
fib
中的第一条语句。第一次调用
fib
时,
memo
[0,1]
,因为尚未对数组进行任何更改
c
3
,因此您得到
未定义的
。因此,在第一次调用中,
memo
不能是
[0,1,1,2]
,无论控制台显示什么

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

更新:Firebug似乎解决了这个问题(如果它曾经存在的话),但它似乎仍然存在于Firebug的灯光下