AS3中的匿名事件处理程序中的'this'是什么

问题描述:

美好的一天!AS3中的匿名事件处理程序中的'this'是什么

我注意到,在匿名事件处理程序this被引用到global,而不是我的课。我知道我可以使用外部引用变量(因为它创建闭包),但是如何获得正确的this上下文?

简单的例子:

_movieClipClassVariable = new MyCustomSpriteSubclass();  
_movieClipClassVariable.addEventListener(MouseEvent.CLICK, function(event:Event):void { 
      trace(this); //gives 'global' 
});      

怎么样的内存使用情况和垃圾收集对象匿名处理程序?是否声明处理程序类方法更好?

我想大部分的时间声明的方法内部类是更好的选择,(因为你不必去想的范围,删除监听器,以没有得到意外垃圾收集,.. )但是有些情况下,匿名函数可能是一个简洁明了的方法。这取决于。

例如:

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 { 
     ... 

是的,你应该真的宣布一个阶级不会在空气中结束。

您在那里使用的委托技术主要用于Javascript。作为一名flash开发人员,我建议将该函数命名并将其全部保存在一个类中。

至于垃圾回收,您需要使用与addEvenListener完全相同的语法来移除EventListener,以便将其释放以进行垃圾回收。

HTH

+0

据我所知,这不是不可能消除匿名事件侦听器(没有讨厌的黑客)。所以它似乎删除了我必须声明它为类方法的监听器。 – artvolk 2010-07-03 07:51:35

取而代之的将右边的事件监听器里的函数声明,声明你的类中的方法。

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" 
    } 
}