AS3:EventListener 回调覆盖函数的默认参数?

AS3: EventListener callback overrides function's default parameters?

我发现今天遇到了一些奇怪的事情。我有一个带有布尔默认参数的函数:

function f(boolean:Boolean=false) {
    trace(boolean);
}

正常调用它会得到你所期望的:

f(); //traces false

但是现在如果我将我的函数作为事件侦听器的回调,就会发生一些奇怪的事情:

addEventListener("test",f);
dispatchEvent(new Event("test")); //traces true

如果我将其设置为点击某物的回调,同样的事情会发生:

mySprite.addEventListener(MouseEvent.CLICK,f); //Traces true on click

谁能解释一下这是怎么回事?我的默认值 false 发生了什么变化?当事件侦听器调用我的函数时,它没有传递任何参数。

当你派发事件时,你的监听函数会接受来自上游的参数,然后将参数转换为布尔值

我认为监听器不会使用默认参数。您可以使用一个小的内联函数来包装您想要调用的函数:

function f(boolean:Boolean=false) {
    trace(boolean);
}

addEventListener("test", function(e:Event):void { f() } );
dispatchEvent(new Event("test")); //traces false

正如 Adob​​e 所说 listener function :

... This function must accept an Event object as its only parameter and must return nothing

所以在你的情况下,如果你这样做:

function f(boolean:Boolean = false) {
    trace(boolean);
}

stage.addEventListener(MouseEvent.CLICK, f);    // gives : true

var event:MouseEvent = new MouseEvent(MouseEvent.CLICK);

trace(Boolean(event));                      // gives : true

f(event);                                   // gives : true

您将始终获得相同的结果:true,因为每次,您的事件变量都会自动传递给您的 f 函数并转换为 Boolean,因为它不是 null 你会得到 true :

trace(Boolean(!null))                       // gives : true