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中测试代码,您将得到相同的延迟行为。