[英]Closure confusion in Javascript
范例1: http : //jsfiddle.net/ufCr8/
function createFunctions() {
var result = new Array();
for (var i = 0; i < 10; i++) {
result[i] = function() {
return i;
}();
}
return result;
}
var funcs = createFunctions();
for (var i = 0; i < funcs.length; i++) {
document.write(funcs[i] + "<br />");
}
示例2: http : //jsfiddle.net/T5shB/
function createFunctions() {
var result = new Array();
for (var i = 0; i < 10; i++) {
result[i] = function(num) {
return function() {
return num;
};
}(i);
}
return result;
}
var funcs = createFunctions();
for (var i = 0; i < funcs.length; i++) {
document.write(funcs[i]() + "<br />");
}
為什么這兩個得到不同的結果?
這些都正常工作。 (並具有相同的結果)。
樣本1:
for (var i = 0; i < 10; i++) {
result[i] = function() {
return i;
}(); // note function application!
}
然后立即執行匿名函數,結果是循環中每次迭代的i
的數字( 當前 )值。 這實際上與result[i] = i
。 不太令人興奮。 (在打印出該值的循環中,沒有函數應用程序,如果不是函數,則將作為數字出現錯誤-在這種情況下,它不同於下面的示例。)
樣本2:
for (var i = 0; i < 10; i++) {
result[i] = function(num) {
return function() {
return num;
};
}(i);
}
應用的外部匿名函數返回一個閉包,該閉包正確地“雙綁定”到以num
形式傳遞的i
的當前值 ( num
實際上是綁定的自由變量)。 請記住,函數引入了新的作用域var
(或for
)沒有引入。
我懷疑“失敗的情況”是:
for (var i = 0; i < 10; i++) {
result[i] = function() {
return i;
}; // note function NOT invoked here!
}
...
for (var i = 0; i < funcs.length; i++) {
document.write(funcs[i]() + "<br />");
}
這將產生“奇數結果”,因為在每個閉包中綁定的i
是相同的 (即i
是自由變量,並且只有一個i
)。 因此,當函數執行時,它將在執行時返回i
的當前值 。
快樂編碼
我建議閱讀《 Jibbering JavaScript Closure Notes》 ( Jibbering JavaScript Closure Notes) ,它不是最入門的資源,但是我發現它可訪問,並且可以詳細解釋事情。 (並且遠比ECMAScript規范IMOHO更易讀)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.