如果控制台日志调用时该元素不存在,为什么 JS 控制台会显示数组中存在的元素?

问题描述 投票:0回答:1

以下函数由“Doug Crockford:JavaScript:The Good Parts”提出。效果很好。

var fibonacci = function () {
  var memo = [0, 1];
  var fib = function (c) {
    console.debug(memo, c, memo[c]);
    var 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 console.log
1个回答
4
投票

这是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
,所以你得到
undefined
。因此,在第一次调用中,无论控制台显示什么,
memo
都不能是
[0, 1, 1, 2]

当您记录对数组或对象的引用时,

某些 JavaScript 控制台似乎显示出这样的行为(以一种或另一种方式)。在这些情况下,通常最好设置断点并逐步执行代码。

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

© www.soinside.com 2019 - 2024. All rights reserved.