与JS中的高阶函数混淆

时间:2019-10-02 13:37:15

标签: javascript

我是JS的新手,正在学习高阶函数及其优点。到目前为止,我所知道的是HOF允许创建泛型函数,我们可以将其重用于多个相关操作,我希望我是对的,为什么我们需要将函数作为参数传递或返回函数以使泛型函数成为函数。好的,如果我们要创建通用和可重用的函数,那么为什么我们需要将函数作为参数传递或返回一个函数。请大家帮助:(

2 个答案:

答案 0 :(得分:5)

更高的顺序并不一定意味着是通用的(多态的)。您可以专门接受Int => Int函数作为参数,并且仍然是高阶的。这仅表示该函数可以接受另一个函数作为参数。

这样做的原因很多,尤其是在函数式编程领域,但是我将不进一步讨论它的细节并使您进一步困惑,因为这本身就是一个很大的主题。

让我们看一下Web开发中的一些常见用例(我猜这是您使用JS的原因)。

回调

顾名思义,

回调是完成另一个函数后要回调的函数。考虑以下功能。

function(argument1, callback){
   var result = doSomethingWithArgument(argument1)
   callback(result)
}

它使用其参数派生出一些东西,然后将其传递给回调。

现在的问题可能是,为什么我们不能在函数外部执行此操作,还是只能在回调内部导出结果?清晰度(除性能影响之外)的主要原因之一是清晰度。

在许多情况下,我们希望被调用到不同的回调中,或者在运行时更改我们要调用的函数。

例如:

function("username", returnToLoginScreen)

function("username", returnToErrorScreen)

其中returnTo ...是将您导航到另一个屏幕的函数。如果查看 Ajax 调用,您会注意到这是它们的工作方式

有关回调herehere的更多信息

过滤器,排序,地图等

另一个可靠的例子是过滤器或排序。您希望能够在不同条件下过滤阵列。假设这是一个对象数组,并且对象具有年龄,身高等字段。

过滤器是高阶的,它使您可以传入不同的比较器,而无需要求为每种可能的条件定义过滤器功能。同样,您可以通过传入函数来定义自定义排序策略。

people.filter(a => a.height > 180) 
people.filter(a => a.age > 20)

前者将过滤身高不足180厘米的任何人,而后者将过滤出身高不到20岁的任何人。

没有您在注释中建议的“帮助”概念。我们从分类的角度来看待这个问题,而不必关心函数如何利用其参数,而仅关注其影响和返回的内容。该函数可能正在使用它来“帮助自己”(也可以做某事/获得一些结果),或者可能只是将其链接并作为“下一步”调用它

答案 1 :(得分:1)

这使您拥有可以将回调函数传递给的功能。例如,在jQuery中,您可以执行此操作$(document).on("click",".my-class-selector", myFunction);,这将在您每次使用myFunction()单击某项时将class="my-class-selector注册为回调函数。