我有这样的功能:
var a = function () {
setTimeout(function () {
alert(2);
}, 0);
alert(1);
}
a();
结果首先是提醒1
,然后是提醒2
但我认为,虽然alert(2)
位于setTimeout
,但会立即执行,因为延迟为0
为什么alert(1)
先执行?
答案 0 :(得分:1)
如果您不想立即执行,只需删除setTimeout,您首先得到alert(1)
因为setTimeout具有最小值,请参阅here。因此,当您将其设置为0时,它将根据浏览器使用最小值。
答案 1 :(得分:1)
setTimeout
有一个默认延迟,导致它在执行 alert(1)
后执行。
答案 2 :(得分:0)
正如其他人所指出的那样,setTimeout()的最小超时时间为4ms。
更重要的是,即使它的实际超时时间为0毫秒,它也不会先触发。那是因为Javascript是单线程的(忽视网络工作者)。
alert(2)
会激活,因为在setTimeout()中设置的任何内容只会在当前Javascript执行完成后触发。换句话说:setTimeout()操作放在执行堆栈的末尾。
因此,当前的函数执行将首先完成(运行alert(1)
),然后才会执行alert(2)
。
这也是setTimeout
仅保证其中的代码在指定时间后执行的原因,而不是完全时间。
请参阅http://ejohn.org/blog/how-javascript-timers-work/以获得精彩概述。