2014-05-15 38 views
1

我正在爲這個概念而努力。通過查看下面,我不明白當我在控制檯上鍵入「counter」等於下面的內容時。它如何知道拿起這段代碼?這個怎麼用?關閉:這個特定的部分是如何工作的?

function(val) { 
    count += val; 
    return console.log(count); 
}; 

守則

var incrementer = function(initialValue) { 
    var count = initialValue; 

    return function(val) { 
    count += val; 
    return console.log(count); 
    }; 
}; 

var counter = incrementer(5); 

counter(3); 
counter(1); 
+1

想想吧,JavaScript中的函數也是對象,它會讓你更容易理解這個概念。就像在其他語言中一樣,可以在該類中訪問的私有實例屬性並鏈接到該特定實例。:) – LNT

回答

1

因爲incrementer返回的功能,這實際上意味着,一旦counter充滿incrementer(5)它則變成由incrementer返回函數的引用,這意味着計數器變量看起來是這樣的,在那個時候:

counter = function(val) { 
    count += val; 
    return console.log(count); 
}; 

爲了驗證這一點:

console.log(counter); 

個到counter因此後續調用將遞增的count

注值:變量count存在的incrementer範圍之內,只能是因爲功能counter指的是範圍內創建訪問。

+1

太棒了。感謝您添加註釋。這非常有幫助。 – Iditarod1973

0

增量器是一個返回函數的函數。計數器等於增量函數的返回值,該函數是一個函數,它接收一個值並遞增最初在增量值(5)中傳遞的值。

調用增量器(5)本質上設置初始狀態,但返回可以用您創建的計數器指針(變量)調用的函數。

這個解釋是否有意義?

var counter = incrementer(5); //initializes the "initial value" and returns a function, thus setting "counter" equal to a function.. aka function pointer 

counter(3); //invokes the function that increments the value by 3 - hence 8 
+0

謝謝! – Iditarod1973

0

在JavaScript中,函數會記住已聲明的上下文。

這是解釋閉包的最快捷方式。

所以,如果你創建一個返回函數的函數,返回的函數將關閉外函數的變量,從而返回具有狀態的函數。

由於在返回函數的「父」範圍內聲明瞭count,所以返回的函數會記住它的內部變量count指向了增量的變量計數。