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
正如 Adobe 所说 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
我发现今天遇到了一些奇怪的事情。我有一个带有布尔默认参数的函数:
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
正如 Adobe 所说 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