Javascript 设置超时不';Don’我不能马上开始

Javascript 设置超时不';Don’我不能马上开始,javascript,timer,dom-events,Javascript,Timer,Dom Events,当我在文档的开头添加以下函数时: (function(){ var d = new Date().getTime(); console.log(new Date().getTime() - d); window.setTimeout(function(){ console.log(new Date().getTime() - d) }, 1); window.setTimeout(function(){ console.

当我在文档的开头添加以下函数时:

(function(){
    var d = new Date().getTime();
    console.log(new Date().getTime() - d);

    window.setTimeout(function(){
        console.log(new Date().getTime() - d)
    }, 1);

    window.setTimeout(function(){
        console.log(new Date().getTime() - d)
    }, 10);

    window.setTimeout(function(){
        console.log(new Date().getTime() - d)
    }, 100);

    window.setTimeout(function(){
        console.log(new Date().getTime() - d)
    }, 1000);
}());
我有这些日志:

0
401
401
402
1397


setTimeout
开始之前,似乎有400毫秒的延迟。为什么?

Javascript不是多线程的-
setTimeout
不会立即启动。调用
setTimeout
时发生的所有情况是,当当前执行堆栈展开时,它将该函数放入要执行的队列中。在您的情况下,大约需要400毫秒才能到达该点

有关这方面的良好教程,请参见。特别是,此报价与以下内容相关:

为了理解定时器如何在内部工作,有一个重要的概念需要探讨:定时器延迟不能保证。由于浏览器中的所有JavaScript都在单线程上执行,因此异步事件(如鼠标单击和计时器)仅在执行过程中出现漏洞时运行


在哪个浏览器中可能存在的副本?而且所有浏览器都有相同的结果?对我来说效果和预期一样:你可能会体验到1毫秒和15毫秒,这取决于浏览器的最小间隔而不是重复,Chris&RCV给出了答案:)@fabien-我回滚了你的编辑,将答案放在问题的顶部-下面的答案有自己的部分,任何人都可以添加。它不应该需要400毫秒才能达到这一点(特别是1000毫秒的测试)。旧浏览器预计需要15毫秒,新浏览器需要4毫秒。很好,这不是因为最小间隔时间,但是引擎执行堆栈上剩余指令所需的时间。可能在页面上发生了其他事情,但在中的示例代码中没有显示question@Chrismegawac有一个很好的观点,即虽然您的解释可以涵盖前3个超时,但1000毫秒的超时应该按计划开始。你认为它为什么会经历同样的400毫秒延迟?