循环中的setTimeout,它的行为与预期不同

时间:2014-12-12 22:13:01

标签: javascript settimeout

所以我知道setTimeout()函数可以在一段时间后触发传入的函数,但它在循环中看起来表现不同。例如:

for (var i = 0; i < 5; i++) {
  setTimeout(console.log(i + ', time is: ' + new Date()), 1000);
}

console.log()似乎同时打印出所有数字。我不懂为什么。你们有些人可以解释为什么setTimeout()在这个循环中不起作用吗?

5 个答案:

答案 0 :(得分:2)

您未将console.log传递给setTimeout,请立即致电。

此外,您需要将i置于关闭状态,否则所有通话都会记录5

试试这个:

function makelogger(i) {
    return function () {
        console.log(i + ', time is: ' + new Date());
    }
}

for (var i = 0; i < 5; i++) {
    setTimeout(makelogger(i), 1000); // or i*1000
}

答案 1 :(得分:0)

如果你想每秒执行一次控制台功能,你需要做一些不同的事情。

&#13;
&#13;
    for (var i = 1; i <= 5; i++) 
    {
      setTimeout( function() 
      {
        document.write(new Date() + "<br />");
      }, (i * 1000));
    }
&#13;
&#13;
&#13;

这将以1秒的间隔显示时间,总共5次。

答案 2 :(得分:0)

setTimeout中,第一个参数应返回稍后将执行的函数。所以你想要一个函数调用的表达式,而不是函数调用本身。

尝试,作为一个粗略的例子:(ttl是试验生活:)

function makelogger(ttl) {
    var msg = ttl + ', time is: ' + new Date();
    console.log(msg);

    if ( ttl > 0 ) {
      setTimeout(function(){return makelogger(ttl-1)}, 1000); 
    }
}
makelogger(5)

Here是完整的MDN说明

答案 3 :(得分:0)

解决问题的方法是将函数包装到闭包中:

&#13;
&#13;
for (var i = 1; i <= 5; i++) 
{  
    (function(j)
    {
        setTimeout(function() 
        {
            document.write(j + " - " + new Date() + "<br />");
        }, (j * 1000));
    })(i);      
}
&#13;
&#13;
&#13;

答案 4 :(得分:-1)

您可以链接setTimeouts:

  setTimeout(function() {
    console.log(1 + ', time is: ' + new Date())
    setTimeout(function() {
        console.log(2 + ', time is: ' + new Date())
    }, 1000);
  }, 1000);

或者你可以使用一个功能来使它变好:

times = 5;
timeout(times);

function timeout(times) {
    setTimeout(function(){
        console.log(times + ', time is: ' + new Date())
        if(times > 1) {
            setTimeout(timeout(times-1), 1000);
        }
    },1000) 
}