2016-11-04 36 views
1

JavaScript變量的值我已經找到一個javascript例子,我需要一個解釋:在封閉

<html> 
<body> 
    <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> 
</html> 

我不明白,爲什麼VAR計數器的值讓每一個我按下按鈕,而在其他地方的時間增加本教程的內容爲:「聲明JavaScript變量的生命週期時啓動。」 當函數完成時,局部變量將被刪除。「

+1

每次單擊按鈕時,執行'add',執行'counter + = 1'。這會給'counter'的當前值增加'1'。 –

+2

*「計數器是一個本地變量,因此在執行函數後會被刪除」*如果已關閉,則不會。 *「每次函數啓動時它應該爲0」*您是對的,但包含'var counter = 0;'的函數僅在頁加載時執行*一次*。 –

+1

如果你沒有使用IIFE,可能會更容易一些:'makeAdd(){var counter = 0;返回函數(){return counter + = 1;}; }; var add = makeAdd();'。 'add'被賦予'makeAdd'的返回值,這是一個函數。 –

回答

0

Javascript變量作用域是函數作用域。

這種情況下它是封閉的。

var add = (function() { 
    var counter = 0; 
    return function() { 
     return counter += 1;} 
    })(); 
    function myFunction(){ 
      document.getElementById("demo").innerHTML = add(); 
    } 

單擊按鈕時,您正在調用myFunction,它在內部調用add方法。

add方法在這裏是一個IIFE,裏面有函數。這種情況已經結束。內部函數可以訪問外部函數變量,但反之亦然。所以當調用add方法時,可以跟蹤變量'counter'的狀態。

希望這會有所幫助

+0

*「添加方法是一個IIFE這裏」*否,'添加'如果從IIFE返回的功能。 –

+0

但是當我們每次調用add函數都不用counter再次初始化爲零? – Mahi

+1

@Mahi:'add'函數是'function(){return counter + = 1;}'。它不會用'0'初始化'counter'。 –