2011-09-11 65 views
1

「Doug Crockford:JavaScript:The Good Parts」提出的以下函數。效果很好。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 

有些想法?

回答

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.debugfib的第一條語句。第一次調用fib時,memo[0, 1],因爲尚未對該數組進行任何更改。 c3,所以你得到undefined。所以在第一次調用時,無論控制檯顯示什麼,memo都不能爲[0, 1, 1, 2]

當您記錄對數組或對象的引用時,某些JavaScript控制檯seem to show such a behaviour(以某種方式或其他方式)。在這些情況下,設置斷點並逐步完成代碼通常會更好。

更新:似乎Firebug修復了這個問題(如果它曾經存在過),但它似乎仍然存在於Firebug中。

+1

+1在Chrome中可靠地記錄對象的唯一方法是記錄它們的克隆...... – pimvdb

相關問題