【发布时间】:2019-04-23 15:05:53
【问题描述】:
所以我想出了这个例子,我不明白为什么 0 秒的 setTimeout 是最后一个被执行的
function waitThreeSeconds() {
setTimeout(function() {
console.log("Finished Function");
}, 0);
}
function clickHandler() {
console.log("Clicked");
}
document.addEventListener('click', clickHandler);
waitThreeSeconds();
//waiting 5 seconds
var ms = 5000 + new Date().getTime();
while (new Date() < ms) {}
console.log('Finished Execution');
如果确实将 setTimeouts 回调添加到队列中,为什么每次我执行单击事件时,它都会更早地添加到队列中,然后是 setTimeout 的回调。直到全局执行上下文('main')从堆栈中弹出
【问题讨论】:
-
是的,我添加了 5 秒的 while 循环,以便在有意义的情况下可以在队列中累积。所有的回调都将在队列中等待。我的问题是为什么 setTimeout 的回调最后发生
-
while (new Date() < ms) {}是一个繁忙的循环,而它正在运行,没有其他东西可以运行 -
也许也来自同一个资源:当前执行的代码必须在队列上的函数执行之前完成,因此生成的执行顺序可能与预期不同。
-
我不了解 JavaScript,但在许多窗口模型中,用户输入是高优先级的事件,而计时器事件的优先级非常低,往往仅在处理完所有其他未决事件后才提供服务。
标签: javascript asynchronous synchronous