AS3: обратный вызов EventListener переопределяет параметры функции по умолчанию?
Я обнаружил, столкнулся с чем-то странным сегодня. У меня есть функция с логическим параметром по умолчанию:
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? Когда слушатель события вызывает мою функцию, он не передает никаких параметров.
3 ответа
Как сказал Adobe о функции слушателя:
... Эта функция должна принимать объект Event как единственный параметр и не должна ничего возвращать
Так что в вашем случае, если вы делаете:
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);
}
addEventListener("test", function(e:Event):void { f() } );
dispatchEvent(new Event("test")); //traces false
Когда вы отправляете событие, ваша функция слушателя примет параметр из восходящего потока, а затем параметр преобразуется в логическое значение