作业队列上的 setTimeout 回调是 运行 还是被清除?

Will the setTimeout callback on the job queue be run or cleared?

如果 setTimeout 调用的回调被添加到作业队列中(例如,如果它在作业队列中是下一个),并且 clearTimeout 在事件循环,提供原始 setTimeout 调用的 id。作业队列上的 setTimeout 回调会是 运行 吗?

或者 运行时间是否神奇地从作业队列中删除了回调?

不,不会是 运行。

官方不知道应该用哪个源备份,不过至少自己试一下很容易

function f() {
    var t1 = setTimeout(function() { console.log("YES"); }, 2000);
    sleep(3000);
    clearTimeout(t1);
    console.log("NO");
}

不,不会运行;它将排队,然后中止。当您调用 setTimeout 时,The specificiation 会经历许多步骤,其中之一(在最短超时后,再加上用户代理填充超时等)最终是:

  1. Queue the task task.

无论第 10 步中返回的句柄是否已被清除,这似乎都会发生 - 即调用 setTimeout总是 产生某些结果正在排队。

当你call clearTimeout, it:

must clear the entry identified as handle from the list of active timers

也就是说,它不会直接影响调用 setTimeout 时已经启动的进程。但是请注意,在该过程的后续阶段,task 已定义为:

  1. Let task be a task that runs the following substeps:

    1. If the entry for handle in the list of active timers has been cleared, then abort this task's substeps.

所以当任务开始执行时,它会首先检查句柄是否已经被清除。