2016-11-08 76 views
-1

這是一個非常簡化的代碼片段來說明問題。解決異步調用中的範圍關閉問題

var srcs = ["url1", "url2", "url3"]; 

for (var i = 0; i < srcs.length; i++) { 

    var img = document.createElement("img"); 

    var tryBrokeClosure = i; 

    img.onload = function() { 
     console.log(tryBrokeClosure); 
    }; 

    img.src = srcs[i]; 
} 

正如你可能猜到了,我期待:

不過的了:

所以我的問題是:我怎樣才能安全地將i變量傳遞給異步函數而不會被原始範圍改變?

編輯:

我有這個answer一個非常相似question,但這個答案使用函數創建打破封閉,東西,我不能在這裏做。

回答

1
img.onload = (function(i) { 
    return function() { 
    console.log(i); 
    } 
})(i); 

img.onload = function(i) { 
    console.log(i); 
}.bind(img, i);