setTimeout不会立即启动

时间:2013-11-24 18:48:26

标签: javascript javascript-events timer

当我将以下功能放在我的文档的头部时:

(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启动之前似乎有400ms的延迟。为什么?

1 个答案:

答案 0 :(得分:3)

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

有关此问题的详细教程,请参阅How Timers Work。特别是,这个引用是相关的:

  

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