我正在迭代一个数组,并为每个元素做一些调用回调的东西。我的问题是在回调中,我需要知道迭代的哪个传递。
简化,我的代码看起来像这样......
for (var i=0; i<3; i++ {
setTimeout(function () {
console.log(i);
},1000);
}
我想要看到
0
1
2
我得到的是
3
3
3
我理解为什么我得到3分,但看不出如何获得0,1,2
NB。这是我的问题的简化版本。在myapp中,我实际上是在调用存储操作,所以我不能简单地将“i”作为回调函数的参数。
答案 0 :(得分:5)
你需要在迭代时捕获值,因为JS具有函数作用域,因此它与你引用的i
相同。(你不需要它。因此你需要创建一个闭包。
for (var i = 0; i < 3; i++) {
(function (a) {
setTimeout(function () {
console.log(a);
}, 1000);
})(i);
}
答案 1 :(得分:1)
为什么得到i
为3是因为settimeout是异步的,并且你的forloop和set timeout函数共享相同的变量i
。这意味着你的for循环在调用回调之前完全运行,在你所有的迭代之后我将进入3
。因此,您的工作是为变量创建局部范围,或者在其他方面创建闭包。
for (var i=0; i<3; i++) {
(function(iter){ //Now with this you are creating a local closure for the variable iter and each setTimeout instance will no longer share the variable `i` instead it will use the variable created in its own scope defined by the anonymous function.
setTimeout(function () {
console.log(iter);
},1000);
})(i)
}