对javascript超时感到困惑

时间:2013-06-14 08:31:28

标签: javascript settimeout

我有这样的功能:

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

a();

结果首先是提醒1,然后是提醒2

但我认为,虽然alert(2)位于setTimeout,但会立即执行,因为延迟为0

为什么alert(1)先执行?

3 个答案:

答案 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/以获得精彩概述。