美好的一天!
我注意到在匿名事件处理程序this
中引用了global
,而不是我的类。我知道我可以使用外部引用变量(因为它创建了闭包),但是如何获得正确的this
上下文?
简单示例:
_movieClipClassVariable = new MyCustomSpriteSubclass();
_movieClipClassVariable.addEventListener(MouseEvent.CLICK, function(event:Event):void {
trace(this); //gives 'global'
});
使用匿名处理程序的内存使用情况和垃圾收集对象怎么样?是否更好地将处理程序声明为类方法?
答案 0 :(得分:1)
是的,你真的应该宣布一堂课不要茫然。
您在那里使用的委托技术主要用于Javascript。作为一名Flash开发人员,我建议命名该函数并将其保存在一个类中。
对于垃圾收集,您需要使用与addEvenListener完全相同的语法removeEventListener,以便将其释放以进行垃圾收集。
HTH
答案 1 :(得分:1)
不要在Event侦听器中添加函数声明,而是在类中声明方法。
class myTestClass
{
private function listenForEvents():void
{
_movieClipClassVariable = new MyCustomSpriteSubclass();
_movieClipClassVariable.addEventListener(MouseEvent.CLICK, onClipClassClickHandler);
}
private function onClipClassClickHandler(event:MouseEvent):void
{
trace(this); // this is the instance of current "myTestClass"
}
}
答案 2 :(得分:1)
我认为大多数时候在类中声明一个方法是更好的选择,(因为你不必考虑范围,删除监听器,不会意外地收集垃圾,......)然而是匿名函数可能是一种简洁明了的方法。这取决于。
例如:
public class XYZ extends Sprite {
...
private function renderBtn() : void {
var btn : SomeButton = new SomeButton();
var ref : XYZ = this;
btn.addEventListener(MouseEvent.CLICK, function(event:Event):void {
trace("XYZ instance: " + ref);
btn.removeEventListener(MouseEvent.CLICK, arguments.callee);
removeChild(btn);
proceed();
});
addChild(btn);
}
private function proceed() : void {
...
答案 3 :(得分:0)