2

我想了解關閉和我在看W3Schools的JavaScript教程。這是他們通過製作計數器給出的一個例子。需要更多關於w3schools的解釋javascript關閉示例

<body> 

<p>Counting with a local variable.</p> 

<button type="button" onclick="myFunction()">Count!</button> 

<p id="demo">0</p> 

<script> 
var add = (function() { 
    var counter = 0; 
    return function() {return counter += 1;} 
})(); 

function myFunction(){ 
    document.getElementById("demo").innerHTML = add(); 
} 
</script> 

</body> 

例子解釋變量添加被分配一個 自我調用函數的返回值。

自調用函數只運行一次。它將計數器設置爲零 (0),並返回一個函數表達式。

這種方式添加成爲一個函數。 「精彩」部分是它可以訪問父範圍中的計數器。

這被稱爲JavaScript關閉。它使 函數具有「私有」變量成爲可能。

該計數器受匿名函數的範圍保護,並且 只能使用add函數進行更改。

注意閉包是一個可以訪問父範圍的函數,即使在父函數關閉後也是如此。

解釋不錯,但有幾件事情不清楚。爲什麼使用自我調用功能是最好的選擇?爲什麼嵌套的匿名函數不是自調函數?爲什麼當計數器已經返回時,你必須返回整個匿名函數?

+0

這W3Schools的是如何寫的例子。它的工作原理雖然這裏是鏈接到「嘗試它」窗口。 http://www.w3schools.com/js/tryit.asp?filename=tryjs_function_counter3請嘗試使用代碼。有用。 – Spilot

+0

讓我編輯.... – Spilot

回答

1

閉包的概念可以解釋爲具有功能及其上下文。上下文有些附屬於函數來解析捕獲的變量(因此命名爲閉包?)。

當執行示例代碼:

var add = (function() { 
    var counter = 0; // This is promoted to the below's function context 
    return function() {return counter += 1;} 
})(); 

創建其中counter變量提升爲匿名函數的上下文因此,你可以從當前範圍訪問該變量的上下文。

此圖或多或少解釋它:

JS Functions and Context

在這種情況下,X和Y是由函數上下文捕獲並且被承載在該功能的所有的執行。

現在,這只是lexical environments的V8實施。

見維亞切斯拉夫·葉戈羅夫使用V8閉合實現很好的解釋:Grokking V8 closures for fun (and profit?)