高阶函数:让你的 JS 代码更牛更有范

简介: 高阶函数:让你的 JS 代码更牛更有范

什么是高阶函数?

首先,高阶函数的确切含义是:比典型函数更高的抽象级别。它是对其他函数执行操作的函数。在此定义中,操作可能意味着将一个或多个函数作为参数,或者将一个函数作为结果返回。 你不必同时做这两个事情。进行一项或多项操作即可将功能视为高阶功能。

示例

如果没有高阶函数,要在数组中的每个数字上加1 并在控制台中显示它,则可以执行以下操作:

const numbers = [1, 2, 3, 4, 5];
​
function addOne(array) {
  for (let i = 0; i < array.length; i++) {
    console.log(array[i] + 1);
  }
}
​
addOne(numbers);

上面代码中函数 addOne()接受一个数组,将1和数组中的每个数字相加,并将其显示在控制台中。原始值在数组中保持不变,但是该函数正在为数组中的每个值做一些事情。

但是,使用最常见的高阶函数forEach(),我们可以简化此过程:

const numbers = [1, 2, 3, 4, 5];
​
numbers.forEach((number) => console.log(number + 1));

哇!

我们已经将上面原始代码中的函数定义和调用抽象为一行!

我们将forEach()应用于名为“numbers”的数组。forEach()开头有一个匿名函数,它一次接受数组中的一个元素。对于名为numbers的数组,将数组中的每个元素命名为“number”是有意义的,尽管我们可以将其命名为“element”或“el”,甚至是“whatever”。

接着,匿名箭头函数将数字+ 1的值输出到控制台。

同样地,高阶函数forEach()将函数应用于数组的每个元素。

另一个高阶函数示例

如果没有更高阶函数,如果我想创建一个新的数组,只有奇数的数字数组,我可以做以下工作:

const numbers = [1, 2, 3, 4, 5];
​
function isOdd(array, oddArr = []) {
  for (let i = 0; i < array.length; i++) {
    if (array[i] % 2 !== 0) {
      oddArr.push(array[i]);
    }
  }
  return oddArr;
}
​
const oddArray = isOdd(numbers);
console.log(oddArray);

上面代码中,函数isOdd()接受一个数组,并有第二个可选的数组形参。如果未提供,则该数组的默认值为空数组。

该函数检查数组中的每个数字,看它是否是奇数。如果数字是奇数,则将其从第二个形参添加到数组中。检查完所有数字后,返回第二个参数的数组。

如果使用高阶函数 filter(),可以这么写:

const numbers = [1, 2, 3, 4, 5];
​
const oddArray = numbers.filter((number) => number % 2 !== 0);
console.log(oddArray);

🤩

代码上是不是精简了很多!

上面代码中首先定义新的数组oddArray,因为应用filter()将创建一个新数组。高阶函数将返回满足匿名函数中设置的条件的每个元素。匿名函数再次应用于numbers数组中的每个元素。

再接再厉,举一反三

我们已经讲了这么多,我想你已经开始明白为什么高阶函数这么好了!

让我们来看另一个例子……

回到我们的forEach()示例中,我们向数组中的每个数字添加1,并将每个值输出到控制台。但如果用这些新值来创建一个新数组呢?没有高阶函数,我可以这样做:

const numbers = [1, 2, 3, 4, 5];
​
function addOneMore(array, newArr = []) {
  for (let i = 0; i < array.length; i++) {
    newArr.push(array[i] + 1);
  }
  return newArr;
}
​
const newArray = addOneMore(numbers);
console.log(newArray);

上面代码中函数addOneMore()再次接受一个数组,并将数组作为第二个参数,该参数的默认值为空。将1添加到现有numbers数组的每个元素中,并将结果推入返回的新数组。

现在我们用高阶函数map()来抽象上面的代码:

const numbers = [1, 2, 3, 4, 5];
​
const newArray = numbers.map((number) => number + 1);
console.log(numbers);

上面代码中首先定义newArray,因为map()创建了一个新数组。与forEach()类似,map()对numbers数组的每个元素应用匿名函数。然而,map()在进程中创建了一个新数组。

进一步

如果我们想要找到numbers数组中所有值的总和,该怎么办?

没有高阶函数,我可以这样做:

const numbers = [1, 2, 3, 4, 5];
​
function getTotalValue(array) {
  let total = 0;
  for (let i = 0; i < array.length; i++) {
    total += array[i];
  }
  return total;
}
const totalValue = getTotalValue(numbers);
console.log(totalValue);

上面代码中函数getTotalValue()接受一个数组,将total变量定义为等于0,并在将每个元素添加到total变量时遍历数组。最后,它返回总数。

现在使用高阶的reduce()函数,这个过程可以再次被抽象出来:

const numbers = [1, 2, 3, 4, 5];
​
const totalValue = numbers.reduce((sum, number) => sum + number);
console.log(totalValue);

上面代码中高阶函数reduce()在内部的匿名函数中需要两个参数。

第一个参数是累加器,第二个参数是numbers数组中的元素。

accumulator参数(上面示例中的sum)跟踪总数,因为reduce()将匿名函数应用到数组的每个元素。

总结

高阶函数为函数提供了更高层次的抽象。它们有可能将您的JavaScript代码带到新的高度!


相关文章
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
560 1
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
1137 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
1653 9
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
1060 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
1217 11
|
JavaScript
JS代码的一些常用优化写法
JS代码的一些常用优化写法
312 0
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
1681 15
在 golang 中执行 javascript 代码的方案详解
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
人工智能 数据可视化 机器人
【通义灵码】三句话生成P5.js粒子特效代码,人人都可以做交互式数字艺术
我发掘出的通义灵码AI程序员新玩法:三句话生成P5.js粒子特效代码,人人都可以做交互式数字艺术
829 6