java 高阶函数_理解 JavaScript 中的高阶函数

7b9885463e34109e105132816b3daec1.png

原文作者:Sukhjinder Arora

译者:UC 国际研发 Jothy

写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。

本文将让大家了解什么是高阶函数以及如何在 JavaScript 中使用它们。

如果你正在学习 JavaScript,那么你应该见过高阶函数这个术语。 它虽然听起来很复杂,但其实并不难。

使 JavaScript 适合函数式编程的原因是它接受高阶函数。

高阶函数在 JavaScript 中广泛使用。 如果你已经用 JavaScript 编程了一段时间,你可能已经在不知不觉中用过它们了。

要完全理解这个概念,首先必须了解函数式编程以及一等函数(First-Class Functions)的概念。

c00c78eb1b9349c198c863ac6cea669f.png什么是函数式编程

在大多数简单的术语中,函数式是一种编程形式,你可以将函数作为参数传递给其他函数,并将它们作为值返回。 在函数式编程中,我们以函数的形式思考和编程。

JavaScript,Haskell,Clojure,Scala 和 Erlang 是部分实现了函数式编程的语言。

98b168c9180397e38ba8d3a57c4e256e.png一等函数

如果你在学习 JavaScript,你可能听说过 JavaScript 将函数视为一等公民。 那是因为在 JavaScript 及其他函数式编程语言中,函数是对象。

在 JavaScript 中,函数是一种特殊类型的对象。 它们是 Function objects。例如:

8d54500840206ea948cc9de4cc1ffc32.png

为了证明 JavaScript 中函数是对象,我们可以这样做:

9044b940e9a41b5321d6a44fb3d6925a.png

注意 - 虽然这在 JavaScript 中完全有效,但这被认为是 harmful 的做法。 你不应该向函数对象添加随机属性,如果不得不这样做,请使用对象。

在 JavaScript 中,你对其他类型(如对象,字符串或数字)执行的所有操作都可以对函数执行。 你可以将它们作为参数传递给其他函数(回调函数),将它们分配给变量并传递它们等等。这就是 JavaScript 中的函数被称为一等函数的原因。

b9c0a75f75be354d098d878255ad52d0.png将函数赋值给变量

我们可以在 JavaScript 中将函数赋值给变量。 例如:

8e75bca673901c9f4654b1eaa25da41b.png

我们也可以传递它们。 例如:

be9cef13020621e2d1b07d966985206e.png

98b168c9180397e38ba8d3a57c4e256e.png将函数作为参数传递

我们可以将函数作为参数传递给其他函数。 例如:

41acd223ea1e7422106a106411ee9af7.png

既然我们已经知道一等函数是什么了,那就让我们开始学习 JavaScript 中的高阶函数叭~

98b168c9180397e38ba8d3a57c4e256e.png高阶函数

高阶函数是对其他函数进行操作的函数,操作可以是将它们作为参数,或者是返回它们。 简单来说,高阶函数是一个接收函数作为参数或将函数作为输出返回的函数。

例如,Array.prototype.map,Array.prototype.filter 和 Array.prototype.reduce 是语言中内置的一些高阶函数。

b9c0a75f75be354d098d878255ad52d0.png动手实践高阶函数

让我们看看一些内置高阶函数的例子,看看它与不使用高阶函数的方案对比如何。

Array.prototype.map

map() 方法通过调用对输入数组中每个元素调用回调函数来创建一个新数组。

map() 方法将获取回调函数中的每个返回值,并使用这些值创建一个新数组。

传递给 map() 方法的回调函数接受 3 个参数:element,index 和 array。

我们来看一些例子:

例 1:

假设我们有一个数字数组,我们想要创建一个新数组,其中包含第一个数组中每个值的两倍。 让我们看看如何使用和不使用高阶函数来解决问题。

不使用高阶函数

7a1dc4e7910688ac2eb7551e7f4ecb81.png

使用高阶函数 map

8f495798a3fa7e10e85823b27f3cb91d.png

使用箭头函数语法将更简短:

f8d767eb178ed27a12eb75d23a6b2a5f.png

例 2:

假设我们有一个包含不同人的出生年份的数组,我们想要创建一个包含其年龄的数组。 例如:

不使用高阶函数

e15447210813b2517441f8fe6a956545.png

使用高阶函数

6342f6c0a22a6362d4e5cea9f3a2ff45.png

Array.prototype.filter

filter() 方法会创建一个新数组,其中包含所有通过回调函数测试的元素。 传递给 filter() 方法的回调函数接受3个参数:element,index 和 array。

让我们看看一些例子:

例 1:

假设我们有一个包含名称和年龄属性的对象数组。 我们想要创建一个只包含成年人(年龄大于或等于18)的数组。

不使用高阶函数

e083214c923eac9d10dfdfb53e27b659.png

使用高阶函数

7cac3e99c521cd2b037955bd336b8642.png

Array.prototype.reduce

reduce 方法对调用数组的每个元素执行回调函数,最后生成一个单一的值并返回。 reduce 方法接受两个参数:1)reducer 函数(回调),2)一个可选的 initialValue。

reducer 函数(回调)接受四个参数:accumulator,currentValue,currentIndex,sourceArray。

如果提供了 initialValue,则累加器将等于 initialValue,currentValue 将等于数组中的第一个元素。

如果没有提供 initialValue,则累加器将等于数组中的第一个元素,currentValue 将等于数组中的第二个元素。

例 1:

假设我们要对一个数字数组的求和:

使用高阶函数 reduce

a256233dce8974791b124253400bc2bf.png

每次对数组中的某个值调用 reducer 函数,累加器都会保留上一次 reducer 函数操作返回的结果,并将 currentValue 设置为数组的当前值。 最后把结果存储在 sum 变量中。

我们还可以为它提供初始值:

f8e8f7ec945f0a0bbbad62bd99e6d84f.png

不使用高阶函数

a55f89ffc63f430ebb43c371121ce3d5.png可以看到使用高阶函数使我们的代码更清晰简洁。复制代码

252d13ba282233cd414fbd18247942b7.png创建我们自己的高阶函数

到目前为止,我们看到了语言中内置的各种高阶函数。 现在让我们创建自己的高阶函数。

我们假设 JavaScript 没有原生的 map 方法。 我们可以自己构建它,从而创建我们自己的高阶函数。

假设我们有一个字符串数组,我们希望把它转换为整数数组,其中每个元素代表原始数组中字符串的长度。

b0764601d8f68599834bf148b51fe78f.png

在上面的例子中,我们创建了一个高阶函数 mapForEach ,它接受一个数组和一个回调函数 fn。 它循环遍历传入的数组,并在每次迭代时在 newArray.push 方法调用回调函数 fn 。

回调函数 fn 接收数组的当前元素并返回该元素的长度,该元素存储在 newArray 中。 for 循环完成后,newArray 被返回并赋值给 lenArray。

252d13ba282233cd414fbd18247942b7.png结论

我们已经了解了高阶函数和一些内置的高阶函数,还学习了如何创建自己的高阶函数。

简而言之,高阶函数是一个可以接收函数作为参数,甚至返回一个函数的函数。 它就像常规函数一样,只是多了接收和返回其他函数的附加能力,即参数和输出。

以上。如果你发现这篇文章有用,请为我点赞~👏

英文原文:

https://blog.bitsrc.io/understanding-higher-order-functions-in-javascript-75461803bad

好文推荐:HTTP/3 来啦,你还在等什么?赶紧了解一下(https://mp.weixin.qq.com/s/ZH5GjB_LjMmfgO6_tYHJdA )

————————————————————————————————

“UC国际技术”致力于与你共享高质量的技术文章

欢迎微信搜索 UC国际技术 关注我们的公众号

或者将文章分享给你的好友

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值