AS3 ссылается на текущую функцию - PullRequest
2 голосов
/ 28 июля 2011

Я только что натолкнулся на любопытный сценарий, в котором я хочу использовать removeEventListener() в функции, у которой нет имени. Под этим я подразумеваю, что я создал функцию в addEventListener() вместо ссылки на одну:

addEventListener(
    Event.ENTER_FRAME, 
    function(e:Event):void
    {
        if(getTimer() > 8000)
        {
            // removeEventListener(Event.ENTER_FRAME, <<this function>>);
            // Other stuff
        }
    }
);

Можно ли сделать ссылку на текущую функцию (т.е. функцию, в которой я работаю)? Или мне просто нужно структурировать вышеуказанный стандартный способ?

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

Ответы [ 3 ]

15 голосов
/ 28 июля 2011

Есть два варианта, вы можете либо дать ему имя (и есть три способа сделать это), либо вы можете использовать arguments.callee .

В случаеПервый, три способа назвать функцию в AS3:

class Foo
{
    // class (static or member) level
    public function bar():void
    {
       // use a variable (technically, this function is anonymous, but we can
       // still use the variable to reference the function itself.
       var inVariable:Function = function():void
       {
          // declare it in a local scope
          function local():void
          {

          }
       }
    }
}

Чтобы использовать именованную функцию:

function callback(e:Event):void {
    trace("tick");
    removeEventListener(Event.ENTER_FRAME, callback);
}
addEventListener(Event.ENTER_FRAME, callback);

Чтобы использовать arguments.callee:

addEventListener(
    Event.ENTER_FRAME, 
    function(e:Event):void
    {
        if(getTimer() > 8000)
        {
            // I get superstitious and I use a local variable.
            var callee:Function = arguments.callee
            removeEventListener(event.type, callee);
            // Other stuff
        }
    }
);
2 голосов
/ 28 июля 2011

Использование анонимных функций в ActionScript - плохой выбор, так как он очень медленный.Также их вряд ли можно собрать мусором.Также полезно упомянуть, что это будет работать только в том случае, если при вызове слушателя (да, в случае с enter_frame это произойдет), поэтому вне анонимной функции другие функции не могут удалить слушателя.Кроме того, is также является соглашением actioncript для использования отдельных функций, что делает ваш код более читабельным, и это займет всего несколько дополнительных символов (просто чтобы назвать его).

addEventListener(Event.ENTER_FRAME, onEnterFrame);

function onEnterFrame(e:Event):void
{
    if(getTimer() > 8000)
    {
         removeEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
}

Если вы хотитеболее простой способ удалить прослушиватель событий;Вы можете определить тип и функцию вызываемого абонента из целевого объекта.Однако я думаю, что это также делает код немного менее читабельным.

e.target.removeEventListener(e.type, arguments.callee);

sources
http://jacksondunstan.com/articles/413
http://gskinner.com/blog/archives/2006/07/as3_weakly_refe.html

2 голосов
/ 28 июля 2011

Вам просто нужно дать ему имя, например:

addEventListener(Event.ENTER_FRAME, function callback(e:Event):void {
    trace("tick");
    removeEventListener(Event.ENTER_FRAME, callback);
});

В этом примере «галочка» будет отслеживаться только один раз.

...