对javascript超时感到困惑吗

对javascript超时感到困惑吗,javascript,settimeout,Javascript,Settimeout,我有这样一个函数: var a = function () { setTimeout(function () { alert(2); }, 0); alert(1); } a(); 结果是先警报1,然后警报2 但是我认为,虽然警报(2)在设置超时中,但是它会立即执行,因为延迟是0 为什么要先执行警报(1)?如果不想立即执行,只需删除setTimeout,您将首先收到警报(1),因为setTimeout有一个最小值,请参阅。因此,当您将其设置为0时,它将

我有这样一个函数:

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

a();
结果是先警报
1
,然后警报
2

但是我认为,虽然
警报(2)
设置超时中,但是它会立即执行,因为延迟是
0


为什么要先执行
警报(1)

如果不想立即执行,只需删除setTimeout,您将首先收到
警报(1)
,因为setTimeout有一个最小值,请参阅。因此,当您将其设置为0时,它将使用取决于浏览器的最小值。

setTimeout
有一个默认延迟,将导致它在执行了
警报(1)
之后执行。

如其他人所述,setTimeout()的最小超时为4ms

但更重要的是,即使它有一个0毫秒的实时超时,它也不会先开火。这是因为Javascript是单线程的(不考虑web工作者)

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

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

这也是
setTimeout
仅保证其内的代码在指定时间后执行,而不是在准确的时间执行的原因


请参阅,了解详细概述。

请参阅Daniel Vandersluis的回答
setTimeout
有一个最小默认延迟,您不能这样做0您应该阅读以下内容:@TamilVendhan是的,这是一个很好的参考。我在回答中也提到了这一点。请落选的选民撤销他的投票?或者指定答案有什么问题?因为我很确定它是100%正确的。