javascript - Javascript函数的明显矛盾行为

标签 javascript

以下功能由“Doug Crockford:JavaScript:好的部分”提出。效果很好。

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 似乎以某种方式动态更新输出以反射(reflect)数组的内容。如果你在 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 中的第一条语句。第一次调用 fib 时,memo[0, 1] 因为数组没有做任何更改。 c3,所以你得到 undefined。因此在第一次调用时,无论控制台显示什么,memo 都不能是[0, 1, 1, 2]

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

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

关于javascript - Javascript函数的明显矛盾行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7377853/

相关文章:

javascript - phoneGap 中的音频不会停止

javascript - JS 函数监听选择元素并根据所选选项更改 CSS 样式?

javascript - Dropkick JS 更改事件值未定义

javascript - javascript中使用的图片文件夹是什么

javascript - Electron :总是返回 ontouchstart = true

javascript - ajax django表单仅提交部分数据

javascript - 如何将登录页面加载为首页

javascript - MeteorJS 中的拼接

javascript - 将参数和默认值动态绑定(bind)到 Javascript 中的现有函数

javascript - 在 JavaScript 中进行继承时,方法没有被传递