Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当设置为0毫秒时,setTimeout在做什么?_Javascript_Settimeout - Fatal编程技术网

Javascript 当设置为0毫秒时,setTimeout在做什么?

Javascript 当设置为0毫秒时,setTimeout在做什么?,javascript,settimeout,Javascript,Settimeout,在JavaScript中,setTimeout(callback,delay)表示“在delay毫秒之后调用callback”。但是如果delay是0?它应该立即调用回调 我很困惑,因为我在运行以下代码时看到了什么: setTimeout(function() { console.log('AAA'); }, 0); // Call this in 0 milliseconds for (i = 0; i < 1000; i++) { console.log('BBB

在JavaScript中,
setTimeout(callback,delay)
表示“在
delay
毫秒之后调用
callback
”。但是如果
delay
0
?它应该立即调用
回调

我很困惑,因为我在运行以下代码时看到了什么:

setTimeout(function() { 
    console.log('AAA');
}, 0); // Call this in 0 milliseconds 

for (i = 0; i < 1000; i++) {
    console.log('BBB'); 
}
for (i = 0; i < 1000; i++) {
    console.log('CCC'); 
}
for (i = 0; i < 1000; i++) {
    console.log('DDD'); 
}
for (i = 0; i < 1000; i++) {
    console.log('EEE'); 
}
setTimeout(函数(){
console.log('AAA');
}, 0); // 在0毫秒内调用此函数
对于(i=0;i<1000;i++){
console.log('BBB');
}
对于(i=0;i<1000;i++){
console.log('CCC');
}
对于(i=0;i<1000;i++){
console.log('DDD');
}
对于(i=0;i<1000;i++){
console.log('EEE');
}
这会将以下内容记录到控制台:

我希望看到
AAA
比这要快得多。在执行本应立即调用的函数之前,还有时间执行4000次对
控制台.log的其他调用


有人能解释一下当延迟设置为0毫秒时,
setTimeout
在做什么吗

一些有用的事实可能有助于澄清发生了什么:

  • JavaScript是单线程的。异步回调被分配给放置在消息队列中的消息
  • 当当前没有代码执行时,事件循环轮询消息队列,请求处理(执行)行中的下一条消息
  • setTimeout
    在指定的延迟时间过后,向队列末尾添加一条消息(提供回调)
  • (注意:这意味着
    setTimeout
    调用中的延迟不是确定的;它是执行回调之前的最小延迟。实际所用的时间取决于处理队列中位于它前面的任何消息所用的时间。)

    那么,如果延迟设置为
    0
    ,会发生什么情况呢?新消息将立即添加到队列中,并将在当前执行的代码完成且任何先前添加的消息都已处理时进行处理

    代码中发生了什么 当您调用
    设置超时时

    setTimeout(function() { 
        console.log('AAA');
    }, 0);
    
    …使用指定的回调将消息添加到队列中。剩下的代码

    for (i = 0; i < 1000; i++) {
        console.log('BBB'); 
    }
    // etc.
    
    (i=0;i<1000;i++)的
    {
    console.log('BBB');
    }
    //等等。
    
    …继续同步执行。完成后,事件循环轮询消息队列以获取下一条消息,并找到带有
    setTimeout
    回调的消息队列,然后对其进行处理(运行回调)

    回调只有在当前执行的代码完成后才会执行,无论需要多长时间

    进一步阅读 有关事件循环的更多详细信息,请参阅:


    查看您的问题的精彩解释!谢谢你的链接,很好的解释。我仍然会保留我的问题(不重复),因为它以一种非常简单的方式显示了直接影响。看起来你不知道什么是
    回调
    (“注意:这意味着setTimeout调用中的延迟不是一件确定的事情…”我从未考虑过这一点。谢谢你指出!简洁明了的回答给出了一个好的初步想法。到目前为止,我在这个主题上找到的最好的信息/简洁配额。谢谢