Что такое «это» в анонимных обработчиках событий в AS3 - PullRequest
1 голос
/ 03 июля 2010

Добрый день!

Я заметил, что в анонимном обработчике событий this ссылается на global, а не на мой класс.Я знаю, что могу использовать внешние переменные, на которые ссылаются (потому что это создает замыкания), но как получить правильный this контекст?

Простой пример:

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

А как насчет использования памяти и объектов сборки мусора с анонимными обработчиками?Является ли объявление обработчиков как метод класса лучше?

Ответы [ 4 ]

1 голос
/ 03 июля 2010

Вместо добавления объявления функций прямо в слушателе событий, объявите метод в вашем классе.

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"
     }
}
1 голос
/ 03 июля 2010

Я думаю, что большую часть времени объявление метода внутри класса - лучший выбор (потому что вам не нужно думать о сфере действия, удалять слушателей, чтобы не получить случайно собранный мусор ...)это случаи, когда анонимная функция может быть кратким и ясным подходом.Это зависит.

Например:

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 { 
        ...
1 голос
/ 03 июля 2010

Да, вы действительно должны объявить класс, чтобы не оказаться в воздухе.

Техника делегирования, которую вы там использовали, в основном используется в Javascript. Как разработчик флеш-памяти, я бы рекомендовал назвать функцию и хранить ее вместе в классе.

Что касается сборки мусора, вам необходимо удалитьEventListener с точно таким же синтаксисом, что и addEvenListener, чтобы освободить его для сборки мусора.

НТН

0 голосов
/ 03 июля 2010

Подробнее об анонимных обработчиках: http://www.ultrashock.com/forums/actionscript/anonymous-functions-remove-listener-121738.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...