我是JS的新手,正在学习高阶函数及其优点。到目前为止,我所知道的是HOF允许创建泛型函数,我们可以将其重用于多个相关操作,我希望我是对的,为什么我们需要将函数作为参数传递或返回函数以使泛型函数成为函数。好的,如果我们要创建通用和可重用的函数,那么为什么我们需要将函数作为参数传递或返回一个函数。请大家帮助:(
高阶并不一定意味着是通用的(多态的)。您可以专门接受Int => Int函数作为参数,并且仍然是高阶的。这仅表示该函数可以接受另一个函数作为参数。
这样做有很多原因,尤其是在函数式编程领域,但是我将不进一步讨论它的细节并使您进一步困惑,因为这本身就是一个很大的主题。
让我们看一下Web开发中的一些常见用例(我猜这是您使用JS的原因)。
回呼
顾名思义,回调是完成另一个函数后要回调的函数。考虑以下功能。
function(argument1, callback){
var result = doSomethingWithArgument(argument1)
callback(result)
}
Run Code Online (Sandbox Code Playgroud)
它使用其参数派生某些东西,然后将其传递给回调。
现在的问题可能是,为什么我们不能在函数外部执行此操作,还是只能在回调内部导出结果?清晰度(除性能影响之外)的主要原因之一是清晰度。
在许多情况下,我们希望被调用到不同的回调中,或者在运行时更改我们要调用的函数。
例如:
function("username", returnToLoginScreen)
function("username", returnToErrorScreen)
Run Code Online (Sandbox Code Playgroud)
其中returnTo ...是可将您导航到另一个屏幕的函数。如果您查看Ajax呼叫,您会注意到这是它们的工作方式
筛选,排序,映射等
另一个可靠的例子是过滤器或排序。您希望能够在不同条件下过滤阵列。假设这是一个对象数组,并且对象具有年龄,身高等字段。
较高级别的过滤器允许您传入不同的比较器,而不是要求您为每个可能的条件定义过滤器功能。同样,您可以通过传入函数来定义自定义排序策略。
people.filter(a => a.height > 180)
people.filter(a => a.age > 20)
Run Code Online (Sandbox Code Playgroud)
前者将过滤身高不足180厘米的任何人,而后者将过滤出身高不到20岁的任何人。
正如您在注释中所建议的,没有“帮助”的概念。我们从分类的角度看待这个问题,而不必关心函数如何利用其参数,而仅关注其影响和返回的内容。该函数可能正在使用它来“帮助自己”(也可以做某事/获得一些结果),或者可能只是将其链接并作为“下一步”调用它
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |