Language concepts 什么';将函数作为参数传递给其他函数的目的是什么?

Language concepts 什么';将函数作为参数传递给其他函数的目的是什么?,language-concepts,Language Concepts,这是一个相当普遍的问题,不是针对任何一种语言的。我不太明白将一个函数作为参数传递给另一个函数背后的意义。我理解,如果一个函数,比如说,foo1()需要使用另一个函数foo2()返回的结果,为什么不能将foo2()返回/更新的值原样传递给foo1()?或者在另一个场景中,为什么不能在foo1()中调用foo2(),并在其中使用其结果? 另外,当foo2()作为参数传递给foo1()时,引擎盖下会发生什么情况?foo2()是在foo1()之前执行的吗 一般来说,在需要对foo2进行多次求值的情况下,

这是一个相当普遍的问题,不是针对任何一种语言的。我不太明白将一个函数作为参数传递给另一个函数背后的意义。我理解,如果一个函数,比如说,
foo1()
需要使用另一个函数
foo2()
返回的结果,为什么不能将
foo2()
返回/更新的值原样传递给
foo1()
?或者在另一个场景中,为什么不能在
foo1()
中调用
foo2()
,并在其中使用其结果?
另外,当
foo2()
作为参数传递给
foo1()
时,引擎盖下会发生什么情况?
foo2()
是在
foo1()
之前执行的吗

一般来说,在需要对
foo2
进行多次求值的情况下,您将函数
foo2
传递给函数
foo1
,并且您可能事先不知道每次调用
foo2
都将使用哪些参数,因此您不可能提前执行这些调用


我认为列表上的
sort()
函数/方法可能是最好的具体例子。考虑一个人的列表-你可能合理地想按字母顺序按名字排序,或者按年龄按数字进行排序,或者按给定的点的地理距离,或许多其他可能的顺序排序。将所有此类排序作为内置选项包含到
sort()
:语言通常采用的方法是允许调用者提供一个函数作为参数,定义列表项之间的排序。

原因有很多:

依赖项注入:如果您传递了一个在生产中将使用数据库调用的方法,并且您将它与不同的参数一起使用,那么在进行单元测试时,您可以用一些模拟来代替它


Map、filter、reduce:您可以对参数列表应用相同的方法,对其进行映射、筛选或缩减。

通常用于提供回调,或将接口与实现分离。查阅以下资料:

1.依赖注入, 2.回调, 3.匿名函数(又名Lambdas), 4.皮姆普尔 等 请看这本书,它在使用C开发TDD时被广泛使用:

看看这个,它可能很有用:基本上不需要重复所有的链接,它是高阶函数所必需的。这些都是很常见的例子。@Don’t虽然这个链接提供了很多东西可以吸收,但我想我还是不太明白这一点/