如何将递增值传递给回调

时间:2013-10-10 16:24:16

标签: javascript

我正在迭代一个数组,并为每个元素做一些调用回调的东西。我的问题是在回调中,我需要知道迭代的哪个传递。

简化,我的代码看起来像这样......

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”作为回调函数的参数。

2 个答案:

答案 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)
}