解决异步调用中的作用域关闭

乔尼·皮亚齐(Jonny piazzi)

这是一个非常简化的代码段,用于说明问题。

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];
}

您可能猜到了,我期待的是:

0
1
2

但是得到了:

2
2
2

所以我的问题是:如何安全地将i变量传递给异步函数而不被原始范围更改?

编辑:

对一个非常类似的问题有这个答案,但是这个答案使用了创建函数来打破闭包的功能,而我在这里无法做到这一点。

尤里·亚基姆(Yuriy Yakym)
img.onload = (function(i) {
  return function() {
    console.log(i);
  }
})(i);

或者

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章