“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
一些想法?
答案 0 :(得分: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控制台seem to show such a behaviour(以某种方式或其他方式)。在这些情况下,通常最好设置断点并逐步完成代码。
更新:似乎Firebug解决了这个问题(如果它曾经存在过),但它似乎仍然存在于Firebug灯中。