如果将setTimeout
调用的回调添加到作业队列中(例如,如果它在作业队列中是下一个),则在事件的当前标记上调用clearTimeout
循环,提供原始id
调用的setTimeout
。是否会运行作业队列上的setTimeout
回调?
或者运行时是否神奇地从作业队列中删除了回调?
答案 0 :(得分:4)
不,它不会运行;它将排队,然后中止。当您致电setTimeout
时,The specificiation会经历多个步骤,其中一个步骤(在最小超时后加上用户代理填充超时等)最终:
- 将任务任务排队。
醇>
无论是否已清除步骤10中返回的句柄,这似乎都会发生 - 即对setTimeout
的调用将总是导致某些事件被排队。
必须清除活动计时器列表中标识为句柄的条目
即它不会直接影响已在setTimeout
调用中启动的流程。但请注意,在该过程的进一步发展中,任务已定义为:
- 醇>
让任务成为运行以下子步骤的任务:
- 如果已清除活动计时器列表中句柄的条目,则中止此任务的子步骤。
因此,当任务开始执行时,它将首先检查句柄是否已被清除。
答案 1 :(得分:1)
不,它不会被运行。
我不知道应该使用哪个来源正式支持它,但它至少很容易为自己尝试。
function f() {
var t1 = setTimeout(function() { console.log("YES"); }, 2000);
sleep(3000);
clearTimeout(t1);
console.log("NO");
}