1樓:qianchaochushui
本質就在與讓乙個全域性變數,訪問函式內部就變數。一般的全域性變數(函式),是沒法訪問另乙個函式內部的變數的,閉包(函式內部返回的函式)可以。
意義的話,就看你怎麼去使用了。
2樓:
做個補充吧,我就不當搬運工了,直接看鏈結(英文):
Closures
MDN這篇閉包的文章比較淺顯實用,其中很多觀點其它答案裡或多或少也都提到了,總結起來就是:
1,實現function factory
2,給callback傳參
3,模擬其它oo語言中的private屬性
3樓:Walter Zhou
先祭上參考資料http://www.
先舉個例子,說明為什麼要用閉包
var data = ;
for (var k = 0; k < 3; k++) ;
}data[0](); // 3, 而不是0
data[1](); // 3, 而不是1
data[2](); // 3, 而不是2
一目明了,使用閉包之後
var data = ;
for (var k = 0; k < 3; k++) ;
})(k); // 傳入"k"值
}// 現在結果是正確的了
data[0](); // 0
data[1](); // 1
data[2](); // 2
這個例子可以回答'什麼樣的需求下才需要閉包?
瀏覽本問題的應該都是像我一樣的js小白,都體會過面對晦澀文字的沮喪,所以寫的時候盡量通俗易懂,做入門之用。
要搞明白閉包,先要弄清楚閉包的七大姑八大姨——作用域鏈(scope chain)、變數物件(variable object)、執行環境(execution contexts)。
var x = 10;
function foo()
(function () )();
即使20小兄弟離foo這麼近,在乙個括號裡面,foo()還是10?
到底是為什麼呢?這就要講到變數物件和執行環境。
在上面這個例子中:
foo()是乙個申明,(function(){})是乙個表示式,(function(){})()是表示自執行函式;
全域性上下文的變數物件是:
globalContext.VO === Global = ;
在「foo」建立時,「foo」的[[scope]]屬性是:
foo.[[Scope]] = [
globalContext.VO
];在「foo」啟用時(匿名函式呼叫),「foo」上下文的活動物件是:
fooContext.AO = ;
「foo」上下文的作用域鏈為:
fooContext.Scope = fooContext.AO + foo.[[Scope]] // i.e.:
fooContext.Scope = [
fooContext.AO,
globalContext.VO
];x=20不會出現在foo的作用域鏈;
這個例子也清晰的表明,乙個函式(這個例子中為從函式「foo」返回的匿名函式)【我認為應該是從匿名函式返回的「foo」函式】的[[scope]]持續存在,即使是在函式建立的作用域已經完成之後。
接下來就要分析data[k]()這個例子的作用域鏈了,我還沒搞明白,看到這的可以去看原版
4樓:songjum
談談自己對js閉包,執行上下文,作用域鏈,活動物件AO,變數物件VO的理解貼上自己看了部落格園湯姆大叔的js系列後的理解,可以去看看原文。
5樓:夏陌陌
js分全域性作用域和函式作用域。函式作用域裡可以訪問到全域性,通過乙個叫作用域鏈的東西。但全域性怎麼訪問函式呢?
就有人想了在函式裡面再寫乙個函式(閉包),這樣把作用域鏈加長了。就可以在全域性訪問到函式裡的資料了。閉包能訪問到父級函式裡面的資料說明父級裡的資料一直存在記憶體中(閉包存在的情況下),這就會導致記憶體一直被佔著。
JS中迴圈和閉包如何理解?
鹽麵包 啟動了 1 5 的迴圈,每次都通過呼叫 setTimeout 建立乙個定時器。首次迴圈的 i 1,那麼延遲為 1 1000 1 秒。第二次及之後的延遲也就是 2,3 i 1000 秒。此時迴圈已經跑完,建立好了所有的定時器,i 最終值為 6。定時器觸發時,輸出了變數 i 也就是 6 了。 哦...
在 JS 中閉包為什麼叫 閉包 ,而不用其它名稱命名?
西門吹牛 這個問題的最終解釋權,需要找這個語法的作者了。哈哈,我覺得關注MDN中對其的定義及解釋,比樓主的問題更有價值 Closures tearshark 第一,沒必要用別的名字。咱又不是搞地下工作的,沒必要整一些暗號一樣的詞彙來干擾試聽。第二,closure和lambda表現上功能很接近。大部分...
python中的閉包和yield?
Jimmy Cheung 其實嘛,python裡有三種scope,分別是global scope,enclosing scope 和 local scope.第一和第三種就很好理解啦,關鍵在於第二種enclosing scope,closure用的就是這個。當乙個函式wrap另乙個函式 def fo...