2016-11-08 77 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);