2017-09-09 132 views
2

我想理解閉包。你將如何解釋這兩種情況的行爲。在javascript中關閉和匿名函數

方案1

<input type="button" value="Click me" onclick="alert(handle())"/> 
<script> 
var handle = (function(){ 
    var count = 0; 
    return function(){ 
    return ++count ; 
    } 
})(); 
</script> 

方案2

<input type="button" value="Click me" onclick="alert(handle()())"/> 
<script> 
var handle = function(){ 
    var count = 0; 
    return function(){ 
    return ++count ; 
    } 
}; 
</script> 

兩者不相同的場景?爲什麼在第一個場景中,外部函數只被調用一次,第一次點擊後,每次點擊內部函數被調用。

+2

[JavaScript中的(function(){})()構造是什麼?](https://stackoverflow.com/questions/8228281/what-is-the-function-construct-in-javascript) – adeneo

回答

0

在第一種情況下,您正在評估函數,因此您所得到的是內部函數,它會在每次調用計數器時遞增計數器。

然而,在第二種情況下,handle包含外部函數,所以如果您調用該函數,您將獲得內部函數,這會在調用時增加計數器。

所以這兩個片段被稱爲handle,當他們實際上做不同的事情。

+0

in第一種情況,每次我點擊按鈕,計數值增加1. – VivekT

+0

你是對的@VivekT我的解釋是不正確的。我編輯了答案,現在我認爲它反映了現實 –

1

在第一種情況下,您創建返回函數的函數句柄,然後調用該函數,以便使用的句柄方法是句柄內的閉包,它跟蹤閉包scop(count)內的變量。第二種情況是你每次都返回一個新的閉包,因爲調用handle()會返回一個新的閉包。因此,您正在重置每個按鈕單擊的範圍,因爲您正在創建一個用handle()調用的新閉包。