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
答
取而代之的将右边的事件监听器里的函数声明,声明你的类中的方法。
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"
}
}
据我所知,这不是不可能消除匿名事件侦听器(没有讨厌的黑客)。所以它似乎删除了我必须声明它为类方法的监听器。 – artvolk 2010-07-03 07:51:35