setTimeout没有'不能立即启动

setTimeout doesn't start instantly

本文关键字:启动 不能 没有 setTimeout      更新时间:2023-10-09

当我将以下函数放在文档的头部时:

(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的延迟。为什么?

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

请参阅计时器的工作原理以获取有关此方面的良好教程。特别是,这个报价是相关的:

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