1

我正在遍历一个数组,并为每个元素做一些调用回调的事情。我的问题是,在回调中,我需要知道它处于迭代的哪个阶段。

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

for (var i=0; i<3; i++ {
  setTimeout(function () {
      console.log(i);
  },1000);
}

我想看看

0
1
2

我得到的是

3
3
3

我明白为什么我得到 3,但看不到如何得到 0、1、2

注意。这是我的问题的简化版本。在 myapp 中,我实际上是在调用存储操作,所以我不能简单地将“i”作为参数提供给回调函数。

4

2 回答 2

5

您需要在迭代时捕获该值,因为 JS 具有函数范围,因此它与i您引用的相同。(并且您不希望那样。因此您需要创建一个闭包。

for (var i = 0; i < 3; i++) {
    (function (a) {
        setTimeout(function () {
            console.log(a);
        }, 1000);
    })(i);
}
于 2013-10-10T16:26:00.773 回答
1

为什么你得到i3 是因为 settimeout 是异步的,你的 forloop 和 set timeout 函数共享同一个变量i。这意味着您的 for 循环在调用回调之前完全运行,而 i3在您的所有迭代之后都会去的地方。因此,您的解决方法是为变量创建一个本地范围,或者换句话说,创建一个闭包。

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)
}
于 2013-10-10T16:28:27.717 回答