2015-02-05 80 views
0

在試圖理解關閉是什麼時,我對理解下面的示例在關閉維基百科文章中提供了一些問題。 WikiPage。 您能否幫我理解這一點,並在可能的情況下提供一個容易理解的封閉定義。理解關閉示例難點

function startAt(x) 
    function incrementBy(y) 
     return x + y 
    return incrementBy 

variable closure1 = startAt(1) 
variable closure2 = startAt(5) 
+0

請看看這裏:http://stackoverflow.com/questions/111102/how-do-javascript-closures-work我也喜歡這個解釋https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Closures – ljnissen 2015-02-05 14:38:10

+1

你能更具體地瞭解你不明白的東西嗎?你知道'closure1'和'closure2'包含'startAt'返回的函數嗎? (相關:[JavaScript關閉如何工作?](http:// stackoverflow。問題/ 111102/how-do-javascript-closures-work)) – apsillers 2015-02-05 14:39:14

+0

apsillers,我打我的前額,但現在上面的例子使完成,因爲,謝謝。我仍在挖掘ljnissens鏈接,以便更好地理解如何輕鬆定義閉包。 – Tyrone 2015-02-05 21:44:42

回答

0

要理解閉包,您首先需要了解範圍。範圍是變量的生命週期。在範圍內聲明的變量是天生的,當範圍結束時它會死亡。例如:

{    // scope begins 
    var x = 0; // variable x is born 
    var y = 1; // variable y is born 
}    // scope ends, x and y both die 

現在,是保持一個變量,即使活着,它是在結束聲明的範圍後一種方式。總之,這是變數可以欺騙死亡的一種方式。變量欺騙死亡的方式是通過關閉。

考慮另一個範圍內的範圍。內部作用域可以訪問在外部作用域內聲明的所有變量。但是,外部範圍無法訪問在內部範圍內聲明的任何變量。

{     // the outer scope has access to x and y only 
    var x = 0; 
    var y = 1; 

    {    // the inner scope has access to x, y and z 
     var z = 2; 
    } 
} 

內部範圍訪問z,因爲它是在內部範圍內聲明。但是,它也可以訪問xy,因爲這兩個變量位於內部作用域的詞法環境(即父作用域)中。

現在考慮如果我們可以將這個內部作用域移到外部作用域之外會發生什麼。

{     // the outer scope has access to x and y only 
    var x = 0; 
    var y = 1; 

    {    // the inner scope has access to x, y and z 
     var z = 2; 
    } ---+ 
}  | 
     | 
{ <------+   // the inner scope moved outside of the outer scope 
    var z = 2; 
} 

在這種情況下,外部範圍結束。因此,xy應與外部範圍一起死亡。但是,他們不能死亡,因爲他們仍然需要內部範圍。當內部作用域被移到外部作用域之外時,它將成爲變量xy(這是它的最高值)的閉包,並且只要它自身存在,它就會保持這些變量的存活狀態。這是關閉的總體思路。

現在考慮下面的代碼:

function startAt(x) { 
    return incrementBy; 

    function incrementBy(y) { 
     return x + y; 
    } 
} 

var closure1 = startAt(1); 
var closure2 = startAt(5); 

這裏,incrementBy函數是一個內部函數。因此,它可以訪問屬於startAt函數的變量x。但是,當我們從startAt返回incrementBy時,我們正在將外部函數外部的內部函數移動。因此,儘管x應該已經由於startAt的回報而死亡,但它仍然存在,因爲它需要incrementBy

因此,incrementBy是一個閉包,因爲它在變量x上關閉,並且只要它自身存在就保持活動狀態;變量x被稱爲關閉incrementBy的upvalue。