Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 什么';AS3中匿名函数的用途是什么?_Flash_Actionscript 3_Function_Anonymous - Fatal编程技术网

Flash 什么';AS3中匿名函数的用途是什么?

Flash 什么';AS3中匿名函数的用途是什么?,flash,actionscript-3,function,anonymous,Flash,Actionscript 3,Function,Anonymous,我见过它们,但我还不明白为什么我应该使用它们。有人能解释一下吗?当您不需要此函数的名称时,在闭包中使用它是很舒服的。即。这样: var myFunc : Function = function() : void {trace("Hello world!");} doSomething(myFunc); 或者这个: button.addEventListener(MouseEvent.CLICK, function(e : MouseEvent) : void {

我见过它们,但我还不明白为什么我应该使用它们。有人能解释一下吗?

当您不需要此函数的名称时,在闭包中使用它是很舒服的。即。这样:

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

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

您不必使用它们,但如果更简单的话可以使用。

本质上,匿名函数允许您创建非常细粒度的行为变体,而无需创建子类,或者将复杂的switch语句封装成一个简短的,clean method block:您必须根据状态做出大量决策,现在只需分配一个函数,在运行时执行特定任务。把它想象成任何变量——只有这种特殊的变量没有值,只有行为

这方面的标准示例是事件侦听器,但您也可以将其应用于所需的任何其他功能

您可以了解匿名函数,然后了解匿名函数的概念。诚然,维基百科的资料中有很多技术术语,但马丁·福勒在这个问题上也有自己的见解。


匿名函数的定义如下:

bar = function(param1, param2, etc) {
    // do stuff here      
}
   obj = new Object();
   obj.foo = function() {
      return "bar";
   }

   trace(obj.foo());  // bar
匿名函数很有趣。与命名函数不同,创建匿名函数时,无法通过代码引用该函数。我们可以通过函数文本来解决这个问题

创建函数时,它返回对自身的引用。在上面的例子中,我们设置了一个变量“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
    }
 }

冒着过于简化的风险,您可以将匿名函数视为需要在运行时创建的“一次性”函数。下面是一个您可以在何处使用的示例:

假设屏幕上有一些用于更改颜色的按钮,每个按钮的处理程序如下所示(伪代码,请忽略语法错误):

创建一堆这样的文档是很痛苦的,更不用说以后很难编辑了

相反,您应该使用“函数工厂”来生成处理程序,如下所示:

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));
在上述“设置并忘记”的情况下,这些方法非常方便


希望上面的示例有助于澄清为什么有人会使用这些东西。

最后一个示例不应使用,因为您无法删除eventlistener,这可能会导致内存泄漏。@标记您仍然可以删除函数e.currentTarget中的侦听器。删除。。。。。。但是,在该函数之外,无法删除它。@mark、@u asMan或者确实可以使用
按钮。removeEventListener(MouseEvent.CLICK,arguments.callee)
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));