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

mrj*_*emp 8 javascript javascript-events

如果我叫clearTimeoutsetTimeout一个已经触发的事件,但其回调仍然在执行队列中,将clearTimeout仍然阻止正在处理该事件?

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

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

Poi*_*nty 6

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

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

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

var t2 = setTimeout(function() {
  alert("hello world");
}, 0);
Run Code Online (Sandbox Code Playgroud)

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

究竟如何在浏览器中工作并不是我熟悉的东西,所以可能会出现一些clearTimeout()不具有相同效果的情况.考虑到执行模型,无论如何,它似乎都是非确定性的.