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

时间:2010-07-03 07:39:48

标签: actionscript-3

美好的一天!

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

简单示例:

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

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

4 个答案:

答案 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)