事件处理程序中的setTimeout似乎没有出现

时间:2014-02-03 23:48:19

标签: javascript events

我知道并非所有放在队列中的setTimout任务都被解雇了(感谢bobnice对此发布的帖子)。但我无法理解为什么在这种情况下不会达成:

我将以下事件处理程序添加到锚链接(通过addEventListener( 'click', ...)以试验所谓的“飞行​​中事件修改”:

var f = function(e) {  
    e.preventDefault(); 
    e.stopPropagation(); // capture first event
    e2 = new MouseEvent("click",{metaKey:true}); // create second event where we hold meta
    e.target.removeEventListener('click', f, false); // remove this handler so no stackoverflow
    e.target.dispatchEvent(e2); // dispatch second event, a "modified" first event.
};

工作正常。

然而,早期版本有这个:

setTimeout( 0, function () {
    e.target.dispatchEvent(e2); // dispatch second event, a "modified" first event.
});

从处理程序内部(作为调试补丁尝试避免stackoverflow,当我无法使removeEventListener工作时 - 我忽略了将我的函数f分配给变量)。

为什么这个setTimeout不会执行?在我的一些测试中,它从未在第一个事件的监听器内执行第二个事件的调度。

显然,setTimeout将dispatchEvent的执行上下文放在函数f的堆栈帧之外,因为fdispatchEvent触发之前返回。

或者说,不会开火。

我想明白为什么它没有在之前版本的代码中触发。

1 个答案:

答案 0 :(得分:4)

setTimeout的超时延迟应该是第二个参数,而不是第一个!这就是它没有开火的原因。