如果我为已发出但其回调仍在执行队列中的clearTimeout
事件调用setTimeout
,那么clearTimeout
是否仍会阻止该事件被处理?
换句话说,是否仍然可以在定时器触发延迟期间清除超时事件并执行其回调?
非正式地说,我的猜测是,一旦超时触发,它会将回调排队并自行销毁 - 使用该计时器ID的clearTimeout
对排队的回调没有影响。
答案 0 :(得分:5)
我认为答案是yes。 (我现在正在使用Firefox。)
编辑 - 为了完整性,我构建的测试是:
var t1 = setTimeout(function() {
clearTimeout(t2);
}, 0);
var t2 = setTimeout(function() {
alert("hello world");
}, 0);
这个想法是两个计时器应该在脚本块完成后立即“准备好”,并且它们应该按照它们被请求的顺序运行。因此,“t1”应在浏览器运行其回调之前清除“t2”。因为没有alert()
发生,我得出结论,clearTimeout()
调用“起作用”,因为它阻止第二个回调运行,即使它的计时器已经过期。
确切地说,浏览器中的工作原理并不是我所熟悉的,因此可能存在clearTimeout()
不具有相同效果的情况。考虑到执行模型,无论如何,它似乎都是非确定性的。