2013-04-10 99 views
-1

我想學習JS,並且相對於JavaScript的閉包我有一個問題 -的Javascript關閉

function fooOuter(){ 
    var a = 10; 
    var b = 20; 
    return function fooinner(x){ 
     return a + b + x; 
    }; 
} 

這是否意味着,在Javascript商店引用內部函數所有處於同一範圍變量。即在這種情況下,fooinner是否存儲變量a和b的引用。

+0

http://stackoverflow.com/questions/500431/javascript-variable-scope – Ofiris 2013-04-10 18:41:48

+1

..........是的。 – svidgen 2013-04-10 18:41:53

回答

3

實際上,是的。有一個由運行時創建的所謂的「作用域鏈」,鏈中的鏈接只在不再引用時釋放。 fooinner()有其自己的範圍,「範圍」鏈接到範圍fooOuter(),等等 - 這是fooinner()的範圍鏈。

fooinner()所使用的變量及其外部定義的變量因此將繼續存在,至少與該特定函數對象所處的時間一樣長。

0

fooInner將爲返回的每個fooInner實例保留a和b的值。換句話說,每個函數將等於10 + 20 + x。實際上它是一個封閉和一個局部。

0

這是我從培訓中得到的一些事實。我希望這有助於

在創建功能,它被分配一個[[scope]]屬性 它引用外詞法範圍的變量並防止 它們被垃圾收集。因此封閉形成於 函數創建。

閉包引用變量不是值。由於每個函數調用都發生在唯一的執行上下文中,因此我們保證連續調用中參數變量的唯一性。

其需要注意的是封閉創建過程是每一個功能相同的 ,每個函數創建一個封閉

0

是它幾乎做到這一點。

簡單地說,一個封閉不是別的,只是一個上下文它可以訪問其父上下文數據。在Stackoverflow或Web上有很多很好的解釋。

但沒有進入更詳細的,第二你的內在功能fooinner被解析,ECMAScript的解釋器內部設置了外部函數的鏈接(我們稱之爲分別激活對象詞法環境記錄)。