0

我有这样的功能:

var a = function () {
    setTimeout(function () {
        alert(2);
    }, 0);
    alert(1);
}

a();

结果是1先alert,然后alert2

但我认为,虽然alert(2)是在setTimeout,但它立即执行,因为延迟是0

为什么alert(1)先执行?

4

3 回答 3

1

如果您不希望它立即执行,只需删除 setTimeout,您将获得alert(1)第一,因为 setTimeout 有一个最小值,请参见此处。因此,当您将其设置为 0 时,它会根据浏览器使用最小值。

于 2013-06-14T08:34:14.060 回答
1

setTimeout有一个默认延迟,这将导致它在执行 alert(1)执行。

于 2013-06-14T08:34:23.483 回答
0

正如其他人还指出的, setTimeout() 的最小超时时间为 4 毫秒。

更重要的是,即使它的实际超时时间为 0 毫秒,它也不会首先触发。那是因为 Javascript 是单线程的(不考虑网络工作者)。

alert(2)最后触发,因为 setTimeout() 中设置的任何内容只会在当前 Javascript 执行完成后触发。换句话说: setTimeout() 动作被放置在执行堆栈的末尾。

因此,当前函数执行将首先完成(运行alert(1)),然后才alert(2)执行。

这也是setTimeout只保证其中的代码在指定时间之后执行的原因,而不是在确切的时间。

请参阅http://ejohn.org/blog/how-javascript-timers-work/以获得很好的概述。

于 2013-06-14T08:35:00.817 回答