可以clearTimeout删除JavaScript中已触发超时事件的未处理回调

Can clearTimeout remove an unprocessed callback of a fired timeout event in JavaScript?

本文关键字:事件 超时 未处理 回调 删除 clearTimeout JavaScript 可以      更新时间:2023-09-26

如果我为已经触发但回调仍在执行队列中的setTimeout事件调用clearTimeoutclearTimeout还会阻止处理该事件吗?

换句话说,在定时器启动及其回调执行的延迟期间,是否仍有可能清除超时事件?

非正式地说,我的猜测是,一旦超时触发,它就会将回调排队并自行销毁——使具有该计时器id的clearTimeout对排队的回调没有影响。

我认为答案是肯定的。(我现在正在使用Firefox。)

编辑—为了完整性,我构建的测试是:

var t1 = setTimeout(function() {
  clearTimeout(t2);
}, 0);
var t2 = setTimeout(function() {
  alert("hello world");
}, 0);

这个想法是,在脚本块完成后,两个定时器都应该立即"就绪",并且它们应该按照请求的顺序运行。因此,"t1"应该在浏览器运行回调之前清除"t2"。因为没有发生alert(),所以我得出结论,clearTimeout()调用"有效",因为它阻止了第二个回调的运行,即使它的计时器已经过期。

我不熟悉浏览器中的具体工作方式,因此可能存在clearTimeout()没有相同效果的情况。不管怎么说,考虑到执行模型,这似乎是非常不确定的。