18

如果我调用clearTimeout一个setTimeout已经触发但其回调仍在执行队列中的事件,是否clearTimeout仍会阻止该事件被处理?

换句话说,是否仍然可以在计时器触发延迟及其回调执行期间清除超时事件?

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

4

1 回答 1

13

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

编辑——为了完整起见,我构建的测试是这样的:

var t1 = setTimeout(function() {
  clearTimeout(t2);
}, 0);

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

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

浏览器中的确切工作方式并不是我所熟悉的,因此在某些情况下可能clearTimeout()不会产生相同的效果。无论如何,考虑到执行模型,这似乎是非常不确定的。

于 2012-08-28T18:20:20.473 回答