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