我在for循环中有以下功能:
loops.push(setInterval(function(){
showNext(i);
}, 5000));
i
是for循环的索引。但是,当运行推送功能时会出现问题。 i
始终设置为for循环的最后一个索引,因为在调用interval函数时,for循环已完成执行。
如何让间隔接收它在现在上的for循环的索引,而不是将它设置为for循环的最后一个索引?
答案 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。