我想做这样的事情:
for(var i=0;i<aList.length;i++)
{
aList[i].doSomething();
sleep(500);
}
当然,javascript中没有 sleep 函数,所以我尝试了以下方法:
for(var i=0;i<aList.length;i++)
{
setTimeout(function(){
aList[i].doSomething();
},500);
}
但是,现在它说 aList[i] 未定义。由于匿名函数是一个闭包,它实际上是从外部函数的作用域中读取aList[i],因此当setTimeout中的函数运行时,i
已经改变了。
有什么方法可以实现这一点?
最佳答案
模拟 JavaScript 1.7 的 let
的快速修复是将其包装在函数中:
for(var i=0; i < aList.length; i++) {
(function(i) {
setTimeout(function() {
aList[i].doSomething();
}, 500 * i); // <-- You need to multiply by i here.
})(i);
}
我还修复了一个小错误,其中脚本将暂停 500 秒,然后执行所有脚本。 setTimeout
是非阻塞的。
关于Javascript如何使用setTimeout对列表进行迭代操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108346/