所以我试图制作一个简单的秒表,使用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;
这段代码似乎跳过了for循环的for循环,然后回到for循环。这里发生了什么?我有一些python编程的基本经验,而在python中,如果你在函数中调用一个函数,你调用的函数将在main函数的下一行代码被处理之前执行。这是javascript如何工作?如果我的代码看起来很糟糕,请原谅我,我是html / css / javascript的新手。
答案 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
几乎是即时的!