2012-04-26 48 views
2

我通過雄辯JavaScript的書和它的工作我的方式有以下代碼:的Node.js VS的Javascript關閉

function createFunction(){ 
    var local = 100; 
    return function(){return local;}; 
} 

當我通過節點控制檯(從命令提示符下運行的節點運行此)通過調用createFunction(),我得到[Function]作爲返回值。然而,根據這本書,我應該得到100.

所以我的兩個問題:這是爲什麼?第二,在節點控制檯中運行這些小示例是測試JS代碼的一個壞主意?

+0

史蒂夫,除了我的第二個問題。運行這些小例子的最佳方式是什麼?我一直在使用節點,你能證實這仍然是一個好辦法嗎?老實說,我不確定所有的部分如何組合在一起。我的理解是節點是從瀏覽器中剝離出來的JS引擎。 – 2012-04-26 00:37:09

回答

4

您需要致電createFunction()的回覆。

createFunction()(); 

第一次調用(())調用createFunction()並返回內部函數,其中,所述第二調用執行並返回local變量這是關閉了。

在節點控制檯(或任何其他)中運行小示例是很好的,只要您知道環境,例如一個瀏覽器的控制檯一般是eval()'d,這可能會產生副作用,比如delete可以如何顯然刪除變量,而不僅僅是對象屬性。

+0

我從來沒有見過這個!感謝您的澄清! – 2012-04-26 00:33:21

3

通過調用createFunction的返回值,得到100,這本身就是一個函數。

createFunction()(); 

...或許更清楚......

var new_func = createFunction(); 

new_func(); 

function createFunction(){ 
    var local = 100; 

// v---v-----------------------v return a function from createFunction 
    return function(){return local;}; 
} 

    // v------- the returned function is assigned to the new_func variable 
var new_func = createFunction(); 

// v------- the returned function is invoked 
new_func(); 
0

對於那些有類似的問題,我完全錯過了雙()這樣的調用看起來像createFunction()()。