将函数传递给函数何时才有意义?

时间:2009-12-06 15:39:56

标签: actionscript-3 functional-programming

好的,所以可以将一个函数传递给另一个函数。 Passing a function to another function in Actionscript 3

这显然非常强大,但更重要的问题是,什么时候这样做才有意义,因为每当你调用另一个函数时都会有性能开销?

6 个答案:

答案 0 :(得分:4)

如果你有很多动作知识,你可能会一直使用这个例子,甚至没有注意到。

EventDispatcher类的addEventListener实际上需要在调用函数时将函数传递给它:

  

的addEventListener(类型:字符串;   listener:Function,useCapture:Boolean   = false,priority:int = 0,useWeakReference:Boolean = false):void

http://livedocs.adobe.com/flex/3/langref/flash/events/EventDispatcher.html

传递函数对于回调来说是一个很大的问题。还有许多其他用途,但这突出了一个更简单的场景。

答案 1 :(得分:4)

性能开销并不比在任何现代OO语言中调用虚拟方法更糟糕。

在使代码变小时将过程传递给其他过程是有意义的。代码越少,错误越少,维护越容易。这是一个例子。这两个函数分别对数字列表和多个数字列表求和。

  (define sum
    (lambda (ls)
      (if (null? ls)
          0
          (+ (car ls) (sum (cdr ls))))))

  (define product
    (lambda (ls)
      (if (null? ls)
          1
          (* (car ls) (product (cdr ls))))))

除了运算符+-以及相应的标识值(01)之外,它们是相同的。不幸的是,我们复制了很多代码。

我们可以通过抽象运算符和身份来降低复杂性。重写的代码看起来像这样。

  (define fold
    (lambda (proc id)
      (lambda (ls)
        (if (null? ls)
            id
            (proc (car ls) (fold (cdr ls) proc id))))))

  (define sum (fold + 0))
  (define product (fold * 1))

现在可以更轻松地查看sumproduct之间的本质区别。此外,只需在一个地方对核心代码进行改进。程序抽象是一种神话般的工具,它取决于能否将程序传递给其他程序。

答案 2 :(得分:3)

以函数作为参数的函数称为高阶函数。谷歌有很多关于这些的信息。

高阶函数的例子:

function compose(f, g) {
  return function(x) {
    return f(g(x));
  };
}

function map(f, xs) {
  var ys = [];
  for(var i = 0; i < xs.length; ++i)
    ys.push(f(xs[i]));
  return ys;
}

有了它,您可以连续转换一个包含两个函数的数组:

var a = ["one", "two", "three"];
var b = map(compose(toUpperCase, reverse), a);
// b is now ["ENO", "OWT", "EERHT"]

答案 3 :(得分:1)

1个例子是javascript AJAX调用

namespace.class.method(parm1, parm2, callback,onErr);

该方法将在服务器上异步运行,一旦完成,它将运行传递的callBack方法

function callback(result) {
      $('#myDiv').innerHTML = result;
}

还有许多其他示例,仅以事件处理为例。

答案 4 :(得分:1)

将函数传递给函数的另一个原因是你希望接收函数在它所做的工作中是灵活的,例如我有一个递归函数来处理目录树,在它将调用它的每个目录上提供的功能并将其传递给当前目录。这样我就可以使用相同的结构来扫描目录,复制目录或删除目录。并且“工作”功能必须足够复杂以处理一个目录而不是树。这主要是通过OO进行过程编程,有更好的方法来执行此操作,继承,委托等。

答案 5 :(得分:0)

另一个非常常见的例子是排序传递谓词的位置,即如何排序,例如

(排序&gt;列表到排序)

这里&gt;是排序时应用的功能。这是一个非常简单的例子,使用大于此值的列表必须是数字,但它可以是任何例如。

(sort(lambda(a b)(&gt;(string-length a)(string-length b)))list-to-sort)

这里传递一个闭包,它比字符串长度更大,所以假定列表包含字符串。

这些类型的东西只是在没有闭包或HOF的语言中吮吸,因为实现相同的所有对象/接口/类型无意义。