我遇到过它们,但我还没有明白为什么要使用它们。有人可以解释一下吗?
答案 0 :(得分:10)
当您不需要为此功能命名时,可以在闭包中使用。 I. e。这样:
var myFunc : Function = function() : void {trace("Hello world!");}
doSomething(myFunc);
或者这个:
button.addEventListener(MouseEvent.CLICK,
function(e : MouseEvent) : void
{
// doSomething
});
您不必使用它们,但如果它更容易,您可以使用它们。
答案 1 :(得分:4)
本质上,匿名函数允许您创建非常细粒度的行为变体,而不必创建子类,或者将复杂的switch语句封装到一个简短的方法块中:必须根据状态做出很多决定,你现在可以简单地分配一个函数来在运行时执行某个任务。可以把它想象成任何变量 - 只有这种特殊的变量没有值,而是行为。
此标准示例是事件侦听器,但您也可以将其应用于您想要的任何其他功能。
您可以了解匿名函数here,然后了解closures at Wikipedia的概念。不可否认,维基百科的来源对技术术语来说有点沉重,但Martin Fowler在这一主题上也有很多readable blog post。
答案 2 :(得分:3)
冒着过度简化的风险,您可以将匿名函数视为您需要在运行时创建的“一次性”函数。以下是您可以在哪里使用的示例:
想象一下,屏幕上有一些按钮可以改变颜色,每个按钮的处理程序都是这样的(伪代码,请忽略语法错误):
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));
在如上所述的“一劳永逸”的情况下,这些非常方便。
希望上面的例子有助于说明为什么有人会使用这些东西。
答案 3 :(得分:1)
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
}
}
请注意,在上面的示例中,我们可以使用factorial替换arguments.callee,该示例仍然有效。但是,有些时候我们没有变量来调用函数。在这些情况下,arguments.callee是唯一的解决方案。一个例子可能是将匿名函数作为参数传递给另一个函数。
函数文字可以在任何时间轴/对象中定义函数,前提是定义时存在路径。例如,要在对象内部创建函数,我们必须使用如下函数文字:
obj = new Object();
obj.foo = function() {
return "bar";
}
trace(obj.foo()); // bar