Javascript setTimeout in for循环一次触发所有事件

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); } 功能设置延

我正在尝试在for循环中运行setTimeout。我按照建议将setTimeout移到一个单独的函数中。然而,在循环结束时,一切似乎都立即启动

在本例中,我希望console.logs每秒启动一次

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
十次。我只是好奇:为什么你问一个问题,甚至不回答别人的评论和答案?