addEventListener(和removeEventListener)堆栈?

Tha*_*Guy 10 actionscript-3

鉴于以下内容:

object.addEventListen(eventType01,handler01);
object.addEventListen(eventType01,handler01);

object.removeEventListener(eventType01,handler01);
Run Code Online (Sandbox Code Playgroud)

对象上有多少个eventType01的事件监听器?一个还是零?

scr*_*pse 27

零.如果调用addEventListener,则在第一次"静默失败"之后的所有后续调用中使用完全相同的参数.根据需要多次调用添加,但单次删除将擦除侦听器.

编辑:要记住的另一件事是,除了不必要的性能开销之外,在同一个对象上调用多个相同的removeEventListener()函数没有任何代价.不会发生致命错误,它会像重复相同的addEventListener调用一样"静默失败".

编辑2:回答@ThomasM ::如果你的听众"发射两次",那么你就没有完全相同的听众.尝试将这个快速而脏的代码放在第1帧的fla中,这个fla有一个正方形的movieclip作为孩子:

import flash.events.*
function foo(e):void{
    trace("hi");
}

this.addEventListener(MouseEvent.CLICK,foo);
this.addEventListener(MouseEvent.CLICK,foo);
this.addEventListener(MouseEvent.CLICK,foo);
Run Code Online (Sandbox Code Playgroud)

请注意,单击动画片段时的输出恰好是一个跟踪动作.

现在将此行添加到代码的末尾

this.removeEventListener(MouseEvent.CLICK,foo);
Run Code Online (Sandbox Code Playgroud)

即使您将foo添加为单击3次的侦听器,这一次调用也会完全杀死侦听器.

所以,如果你遇到一个问题,"同一个听众"会发射两次,那么你正在做的事情可能是这样的:

this.addEventListener(MouseEvent.CLICK, function(e){
    trace("hi");
});

this.addEventListener(MouseEvent.CLICK, function(e){
    trace("hi");
});
Run Code Online (Sandbox Code Playgroud)

这肯定会"发射两次",因为听众的功能并不相同.它们执行相同的操作,但它们不会在内存中引用相同的位置.它们不指向同一个函数对象.此外,这是非常糟糕的做法,因为您无法实际删除这些侦听器.你会怎么做?你没有提到它们.

  • 那么为什么如果你添加两个完全相同的监听器,该函数会触发两次? (2认同)