我想學習JS,並且相對於JavaScript的閉包我有一個問題 -的Javascript關閉
function fooOuter(){
var a = 10;
var b = 20;
return function fooinner(x){
return a + b + x;
};
}
這是否意味着,在Javascript商店引用內部函數所有處於同一範圍變量。即在這種情況下,fooinner是否存儲變量a和b的引用。
我想學習JS,並且相對於JavaScript的閉包我有一個問題 -的Javascript關閉
function fooOuter(){
var a = 10;
var b = 20;
return function fooinner(x){
return a + b + x;
};
}
這是否意味着,在Javascript商店引用內部函數所有處於同一範圍變量。即在這種情況下,fooinner是否存儲變量a和b的引用。
實際上,是的。有一個由運行時創建的所謂的「作用域鏈」,鏈中的鏈接只在不再引用時釋放。 fooinner()
有其自己的範圍,「範圍」鏈接到範圍fooOuter()
,等等 - 這是fooinner()
的範圍鏈。
fooinner()
所使用的變量及其外部定義的變量因此將繼續存在,至少與該特定函數對象所處的時間一樣長。
fooInner將爲返回的每個fooInner實例保留a和b的值。換句話說,每個函數將等於10 + 20 + x。實際上它是一個封閉和一個局部。
這是我從培訓中得到的一些事實。我希望這有助於
在創建功能,它被分配一個[[scope]]屬性 它引用外詞法範圍的變量並防止 它們被垃圾收集。因此封閉形成於 函數創建。
閉包引用變量不是值。由於每個函數調用都發生在唯一的執行上下文中,因此我們保證連續調用中參數變量的唯一性。
其需要注意的是封閉創建過程是每一個功能相同的 ,每個函數創建一個封閉
是它幾乎做到這一點。
簡單地說,一個封閉不是別的,只是一個上下文它可以訪問其父上下文數據。在Stackoverflow或Web上有很多很好的解釋。
但沒有進入更詳細的,第二你的內在功能fooinner
被解析,ECMAScript的解釋器內部設置了外部函數的鏈接(我們稱之爲分別激活對象詞法環境記錄)。
http://stackoverflow.com/questions/500431/javascript-variable-scope – Ofiris 2013-04-10 18:41:48
..........是的。 – svidgen 2013-04-10 18:41:53