Javascript 事件处理程序中的setTimeout未显示为激发

Javascript 事件处理程序中的setTimeout未显示为激发,javascript,events,Javascript,Events,我知道并不是所有放在队列上的setTimout任务都会被触发,这要感谢bobnice在这方面的一篇文章。但我不明白为什么在这种情况下无法达到: 我通过addEventListener“click”将以下事件处理程序添加到锚链接中。。。要尝试所谓的飞行中事件修改: var f = function(e) { e.preventDefault(); e.stopPropagation(); // capture first event e2 = new MouseEve

我知道并不是所有放在队列上的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.
});
当我无法让removeEventListener工作时,作为调试补丁从处理程序内部尝试避免堆栈溢出-我忽略了将函数f分配给变量

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

显然,setTimeout将dispatchEvent的执行上下文置于函数f的堆栈帧之外,因为f在dispatchEvent激发之前返回

或者,更确切地说,不会开火


我想确切地理解为什么它在以前版本的代码中没有触发。

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

的超时延迟应该是第二个参数,而不是第一个参数!这就是为什么它没有着火。

我总是把它弄混@Cris e也没有在setTimeout中声明。@ps2goat是否会从setTimeout中的匿名函数内部关闭,因为setTimout在f内?@ps2goat否它没有。它说,从内部处理,这是不清楚的,没有阅读的话。如果你读的话,它是清楚的。我总是混淆@Cris e也没有在setTimeout中声明。@ps2goat是否会从setTimeout中的匿名函数内部关闭,因为setTimout在f内?@ps2goat否它没有。它说,从内部处理,这是不清楚的,没有阅读的话。如果你读这些词,它是清楚的。