设置间隔之前的索引更改

时间:2014-01-08 03:39:05

标签: javascript for-loop setinterval

我在for循环中有以下功能:

loops.push(setInterval(function(){
    showNext(i);
}, 5000));

i是for循环的索引。但是,当运行推送功能时会出现问题。 i始终设置为for循环的最后一个索引,因为在调用interval函数时,for循环已完成执行。

如何让间隔接收它在现在上的for循环的索引,而不是将它设置为for循环的最后一个索引?

3 个答案:

答案 0 :(得分:2)

添加一个闭包。像这样:

for(var i=0; i<n; i++){
  (function(i){
      loops.push(setInterval(function(){
         showNext(i);
      }, 5000));
  })(i);
}

这样,内部i与外部for(var i=0; i<n; i++){ (function(x){ loops.push(setInterval(function(){ showNext(x); }, 5000)); })(i); } 不同。这是相同的,但更容易理解:

x

通过这种方式,每个循环周期有{{1}}个不同。由于它不再共享,因此不会被覆盖。

来自玻利维亚拉巴斯的欢呼声

答案 1 :(得分:1)

您可以将i绑定为函数的参数:

loops.push(setInterval(showNext.bind(this, i), 5000));

Fiddle

您确定使用 setInterval 而不是 setTimeout

答案 2 :(得分:0)

使用 Function.prototype.bind() 非常简单:

// the first parameter of bind is not important in this case.
loops.push(setInterval(showNext.bind(this, i), 5000));

注意.bind需要为旧版浏览器使用Polyfill。