clearTimeout可以在Javascript中删除已触发的超时事件的未处理回调吗?

时间:2012-08-28 18:16:36

标签: javascript javascript-events

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

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

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

1 个答案:

答案 0 :(得分:5)

我认为答案是yes。 (我现在正在使用Firefox。)

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

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

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

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

确切地说,浏览器中的工作原理并不是我所熟悉的,因此可能存在clearTimeout()不具有相同效果的情况。考虑到执行模型,无论如何,它似乎都是非确定性的。