Javascript过去循环然后回到它?

时间:2017-08-26 01:24:56

标签: javascript html css

所以我试图制作一个简单的秒表,使用setTimeout在javascript中按毫秒计算,我在初始阶段遇到了这个问题:



var time = 0;

function main() {
  for (var i = 0; i < 5; i++) {
    setTimeout(timer, 1);
  }
  alert(time + " after the for loop");
}

function timer() {
  time++;
  alert(time + " in the for loop");
}

document.getElementById("go").onclick = main;
&#13;
#go {
    height: 40px;
    border: 1px solid lime;
    border-radius: 10px;
    background-color: lime;
}
&#13;
<button id="go">Start!</button>
&#13;
&#13;
&#13;

这段代码似乎跳过了for循环的for循环,然后回到for循环。这里发生了什么?我有一些python编程的基本经验,而在python中,如果你在函数中调用一个函数,你调用的函数将在main函数的下一行代码被处理之前执行。这是javascript如何工作?如果我的代码看起来很糟糕,请原谅我,我是html / css / javascript的新手。

3 个答案:

答案 0 :(得分:2)

当您调用setTimeout(timer, 1)时,timer函数将在您指定的时间后异步调用(在您的情况下为1ms)。

代码继续运行(它不等待超时完成 - 这是异步的点 - 它是非阻塞的) - 因此" after the loop"警报显示在其他代码之前。< / p>

答案 1 :(得分:2)

这是因为setTimeout函数是异步的。

将其视为setTimeout函数离开到另一个地方(调用web api)等待一秒钟(因此alert(time + " after the for loop");将首先运行)然后它传递给事件循环并最终运行计时器函数

答案 2 :(得分:0)

setTimeout()是异步的,它在后台启动一个计时器,稍后调用你的函数。您可能会将其视为睡眠陈述,但事实并非如此。

对于实际使用,通常使用闭包函数很好:

setTimeout(function() { alert('My alert'); }, 1000);

另请注意,超时时间以毫秒为单位,因此1几乎是即时的!