AS3 — Анонимная функция «это»

Я поэкспериментировал с некоторыми анонимными функциями и заметил, что этот код не отслеживает одно и то же дважды:

public function Main() 
    {
        trace(this);

        stage.addEventListener(MouseEvent.CLICK, function(e:Event):void
        {
            trace(this);
        });
    }

Первая трассировка отслеживает «[объект Main]», а вторая — «[object Global]» (после того, как я щелкнул). Почему это происходит? А что такое объект Global, он для чего-то нужен?


person Erik W    schedule 25.12.2014    source источник


Ответы (2)


Анонимная функция позволяет создавать варианты поведения без создания подкласса или каких-либо сложных операторов переключения, поэтому теперь вы можете просто назначить функцию для выполнения определенной задачи во время времени выполнения. Похожа на любую переменную — только переменная этого особого типа имеет не значение, а поведение.

//clasic
bar = function(arg1, arg2, etc) {
    // do something here      
}

когда вы trace(this) указываете, что возвращает функция, это специальная глобальная переменная 'bar'.
Стандартным примером для этого являются прослушиватели событий, но вы также можете применить это к любым другим функциям, которые вам нужны. .

Вы можете узнать об анонимных функциях здесь: http://blogs.adobe.com/simplicity/2007/10/post.html.

person tziuka    schedule 25.12.2014

В этом случае ключевое слово this представляет собой global object, некую альтернативную вселенную, в которой была создана ваша функция, поскольку она была определена вне какого-либо пользовательского класса или объекта.

Основной класс

package 
{
    import flash.display.MovieClip;
    import flash.events.MouseEvent;

    public class Main extends MovieClip
    {
        public function Main()
        {
            // trace(this);
            stage.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void
            {
                trace(this);
            });
        }
    }
}

вывод

[object global]

В следующем примере слушатель функции toClick определен как method of the Main class, поэтому this относится к object Main.

Правильный код

package
{
    import flash.display.MovieClip;
    import flash.events.MouseEvent;

    public class Main extends MovieClip
    {
        public function Main()
        {
            // trace(this);
            stage.addEventListener(MouseEvent.CLICK, toClick);
        }

        private function toClick(e:MouseEvent):void
        {
            trace(this); 
        }
    }
}

Вывод

[object Main]
person helloflash    schedule 26.12.2014