Javascript setTimeout in for循环一次触发所有事件
我正在尝试在for循环中运行setTimeout。我按照建议将setTimeout移到一个单独的函数中。然而,在循环结束时,一切似乎都立即启动 在本例中,我希望console.logs每秒启动一次Javascript setTimeout in for循环一次触发所有事件,javascript,for-loop,settimeout,Javascript,For Loop,Settimeout,我正在尝试在for循环中运行setTimeout。我按照建议将setTimeout移到一个单独的函数中。然而,在循环结束时,一切似乎都立即启动 在本例中,我希望console.logs每秒启动一次 function setDelay(i) { setTimeout(function(){ console.log(i); }, 1000); } for (var i = 1; i <= 10; ++i) { setDelay(i); } 功能设置延
function setDelay(i) {
setTimeout(function(){
console.log(i);
}, 1000);
}
for (var i = 1; i <= 10; ++i) {
setDelay(i);
}
功能设置延迟(i){
setTimeout(函数(){
控制台日志(i);
}, 1000);
}
对于(var i=1;i代码的问题是,它将创建10个超时,在1秒后或多或少同时触发
如果希望每秒(或任何其他频率)执行一次,可以使用setInterval。实现这一点的最简单方法是将超时乘以索引:
function setDelay(i) {
setTimeout(function(){
console.log(i);
}, i * 1000);
}
循环中没有延迟,因此您实际需要的是第一次将间隔设置为1000ms,第二次设置为2000ms,以此类推
function setDelay(i) {
setTimeout(function(){
console.log(i);
}, 1000 * i);
}
for (var i = 1; i <= 10; ++i) {
setDelay(i);
}
功能设置延迟(i){
setTimeout(函数(){
控制台日志(i);
},1000*i);
}
对于(var i=1;i您最好使用setInterval()而不是setTimeout()。使用clearInterval()可以停止它的运行。由于for循环本身没有作用域,所以您所编写的代码无法运行。您可以使用setInterval()来绕过for循环。您也可以这样做:
(function updateEverySecond(){
console.log(1);
setTimeout(updateEverySecond, 1000);
})();
使用setInterval
和引用计数器可能是更好的解决方案
(函数(){
变量计数=0,
上限=3,
间隔时间=1000,
间隔=设置间隔(函数(){
如果(计数===上限){
间隔时间;
}否则{
控制台日志(计数);
计数++;
}
},休息时间);
}());
我对输出很好奇真的,我猜I
变量保留了这个值,因为它在一个不同的函数中?如果它是循环变量,它肯定只会输出10
十次。我只是好奇:为什么你问一个问题,甚至不回答别人的评论和答案?