Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 - Fatal编程技术网

Javascript 当计时器为0毫秒时,setTimeout回调为什么要等待循环结束?

Javascript 当计时器为0毫秒时,setTimeout回调为什么要等待循环结束?,javascript,Javascript,关于闭包,我不明白的是,setTimeout回调在循环完成之前不会启动。在我看来,很明显,该函数是在每次迭代中执行的 我不关心为什么它们都是“6”,我理解这一部分。我只需要解释一下,为什么要等到循环完成后才能真正运行 for (var i = 1; i <= 5; i++) { setTimeout(function timer() { console.log(i); }, 0); } for(var i=1;iJavaScript使用单个 事

关于闭包,我不明白的是,
setTimeout
回调在循环完成之前不会启动。在我看来,很明显,该函数是在每次迭代中执行的

我不关心为什么它们都是“6”,我理解这一部分。我只需要解释一下,为什么要等到循环完成后才能真正运行

for (var i = 1; i <= 5; i++) 
{
    setTimeout(function timer() 
    {
        console.log(i);
    }, 0);
}

for(var i=1;iJavaScript使用单个

事件循环正忙于运行调用
setTimeout
的函数,因此它不会查看超时队列上是否有任何事件等待运行


即使不是这样,大多数JS实现都会实现一个最小超时(请参阅)值,如果该值低于该值,则会提高传递给它的值(
0
)。

设置超时会排队在当前事件循环结束时开始运行。因此,设置超时可能会比for循环结束时晚很多

MDN对setTimeout的事件循环有很好的描述:

 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop
具体而言,本部分:

调用setTimeout将在该时间之后向队列添加消息 作为第二个参数传递。如果队列中没有其他消息, 立即处理消息;但是,如果有消息, setTimeout消息将必须等待其他消息发送 已处理。因此,第二个参数表示最小值 时间,而不是保证的时间


最常见的javascript副本……此外,将
0
传递到
setTimeout
并不真正意味着
0
毫秒。通常会有一个最小值。@djechlin:你对这个问题读得有多仔细?@djechlin:我不得不承认,它的设置听起来像典型的“循环中的函数”问题。我不知道这个问题有多普遍,但至少它比普通的有点有趣。但是,是的,我想象那里有很多重复。@mike:你要明白,回调直到循环结束后才会启动这一事实与闭包无关。这是一个完全不同的概念。但是,你知道吗如果您使用
.nextTick()
在NodeJS中测试代码,您将得到相同的延迟行为。