mrj*_*emp 8 javascript javascript-events
如果我叫clearTimeout
了setTimeout
一个已经触发的事件,但其回调仍然在执行队列中,将clearTimeout
仍然阻止正在处理该事件?
换句话说,是否仍然可以在定时器触发延迟期间清除超时事件并执行其回调?
非正式地说,我的猜测是,一旦超时触发,它会将回调排队并自行销毁 - clearTimeout
使用该计时器的id对排队的回调没有影响.
我认为答案是肯定的.(我现在正在使用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()
不具有相同效果的情况.考虑到执行模型,无论如何,它似乎都是非确定性的.