Какая польза от анонимных функций в AS3? - PullRequest
9 голосов
/ 16 февраля 2012

Я сталкивался с ними, но я еще не понял, почему я должен их использовать.Может ли кто-нибудь объяснить это?

Ответы [ 4 ]

11 голосов
/ 16 февраля 2012

Удобно использовать в замыканиях, когда вам не нужно имя для этой функции.И. е.таким образом:

var myFunc : Function = function() : void {trace("Hello world!");}
doSomething(myFunc);

или это:

button.addEventListener(MouseEvent.CLICK,
    function(e : MouseEvent) : void
    {
        // doSomething
    });

Вам не нужно их использовать, но вы можете, если это проще.

4 голосов
/ 16 февраля 2012

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

Стандартный пример этого - слушатели событий, но вы также можете применить это к любой другой функциональности, которую пожелаете.

Вы можете узнать об анонимных функциях здесь , а затем узнать о концепции замыканий в Википедии . Следует признать, что источник в Википедии немного сложен с техническими терминами, но у Мартина Фаулера также есть вполне читаемый пост в 10101 на эту тему.

3 голосов
/ 18 февраля 2013

Опасаясь чрезмерного упрощения, вы можете думать об анонимных функциях как о «одноразовых» функциях, которые необходимо создавать во время выполнения. Вот пример, где вы могли бы использовать один:

Представьте, что на экране есть несколько кнопок для изменения цвета, и обработчик для каждой из них выглядит следующим образом (псевдокод, пожалуйста, пропустите синтаксические ошибки):

private function redBtnHandler(): void {
  GlobalBrush.setColor(0xff0000);
}
private function greenBtnHandler(): void {
  GlobalBrush.setColor(0x00ff00);
}
private function blueBtnHandler(): void {
  GlobalBrush.setColor(0x0000ff);
}
...
redBtn.setClickHandler(redBtnHandler);
greenBtn.setClickHandler(greenBtnHandler);
blueBtn.setClickHandler(blueBtnHandler);
...

Больно создавать кучу таких, не говоря уже о том, что их трудно редактировать позже.

Вместо этого вы будете использовать «фабрику функций» для генерации обработчиков, например:

private function generateBtnHandler(rgb:uint): Function {
  var btnHandler:Function = function(): void {
    GlobalBrush.setColor(rgb);
  }
  return btnHandler;
}
redBtn.setClickHandler(generateBtnHandler(0xff0000));
greenBtn.setClickHandler(generateBtnHandler(0x00ff00));
blueBtn.setClickHandler(generateBtnHandler(0x0000ff));

В ситуациях «установил и забыл», подобных описанным выше, они чрезвычайно удобны.

Надеюсь, что приведенный выше пример помог понять, почему кто-то будет использовать эти вещи.

1 голос
/ 16 февраля 2012

http://www.adobe.com/devnet/actionscript/learning/as3-fundamentals/functions.html
http://www.alanmacdougall.com/blog/post/3/

Или

Анонимная функция определяется следующим образом:

bar = function(param1, param2, etc) {
    // do stuff here      
}

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

Когда функция создается, она возвращает ссылку на себя. В приведенном выше примере мы устанавливаем переменную "bar" для ссылки на анонимную функцию, которую мы создаем.

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

При создании анонимной рекурсивной функции функция может ссылаться на себя, используя свойство arguments.callee. Рассмотрим этот пример:

    // classic factorial recursion example
    factorial = function(n) {
    if (n <= 1) {
            return n;
    } else {
            return n*arguments.callee(n-1);  // call ourself to recurse
    }
 }

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

Литералы функций могут определять функции на любой временной шкале / объекте, если путь существует во время определения. Например, чтобы создать функцию внутри объекта, мы должны использовать такой литерал функции:

   obj = new Object();
   obj.foo = function() {
      return "bar";
   }

   trace(obj.foo());  // bar
...