JS的高阶函数

news/2024/12/29 6:56:10/

✨高阶函数的介绍

高阶函数是指接受一个或多个函数作为输入参数,并/或者返回一个新函数的函数,简单来说,就是操作函数的函数。在 JavaScript 中,高阶函数是一等公民,即它可以与基础类型一样被传递和使用。

在函数式编程中,高阶函数是非常重要的概念,发挥了对代码的简洁性和可重用性的优化作用。

以 map 方法为例,它接收一个函数作为参数,该函数将应用于原数组的每个元素上,并把处理后的结果组成一个新的数组返回。实现如下:

// 普通函数
function double(x) {return x * 2;
}const arr1 = [1, 2, 3];
const arr2 = arr1.map(double); // [2, 4, 6]

通过把 double 函数作为参数传入 map 函数,我们可以把 double 函数应用到原数组的每个元素上,从而得到一个新的数组。

另外,高阶函数在 JavaScript 中贯穿始终,它们可以触发一系列的函数调用链。例如,JQuery 中的方法链,可以用于多次调用函数,每个方法返回的都是一个 JQuery 对象,方便链式调用。

高阶函数是一种强大的抽象概念,有助于我们编写更简洁、更模块化和更具有可重用性的代码。

✨高阶函数的应用

以下是在JavaScript中常见的高阶函数的应用:

  1. 声明式函数式编程: 声明式函数式编程通常使用 map、filter、reduce 和其他高阶函数,能够快速对数组进行操作。这种编程方式使代码更加简洁、可读、易于维护和调试。

  2. 面向对象编程:利用面向对象编程可以通过方法接收和返回函数来增强代码的灵活性和可重用性。例如,在 React 中,我们可以使用高阶组件来构建组件逻辑的复用。

  3. 异步控制:JavaScript 中的 Promise 和 async/await 都是高级函数,用于更好处理回调函数和异步控制。Promise 和 async/await 将异步操作模块化,并通过组合多个 Promise 来实现复杂操作。

  4. 偏函数:偏函数是一种通过对函数传递部分参数产生新函数的技术。例如:React的 useCallback和 React.memo 都是对useReducer函数的偏函数。

  5. 函数式组合:函数式组合是一种在函数式编程中组合小而简单的函数的方法。它创建了更大的函数,具有更强的抽象和更小的副作用。例如, Redux 库使用函数式的方法将行动创建器组合到页面上。

高级函数可以使代码更加清晰,易于理解、维护、扩展和重用,许多现代库和框架都在广泛使用高级函数概念。

✨高阶函数的示例

下面列举一下常见的高阶函数示例,以展示高阶函数的用例和意义:

  1. Map 函数:Map函数通常被用于将一个数组中的元素转化为另一个数组。
const array1 = [1, 2, 3, 4, 5];
const map1 = array1.map(x => x * 2);
console.log(map1); // 输出 [2, 4, 6, 8, 10]

在这个例子中,map 函数接受一个函数作为它的参数,将其应用于数组中的每个元素,并返回一个新数组。

  1. Filter 函数:Filter 函数通常被用于过滤数组中的元素。
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
console.log(result); // 输出 ["exuberant", "destruction", "present"]

在这个例子中,filter 函数接受一个函数作为它的参数,并返回一个新数组,其中包含符合过滤条件的元素。

  1. Reduce 函数:Reduce 函数通常被用于将数组中元素的值转化成单个值。
const array2 = [1, 2, 3, 4, 5];
const reducer = (accumulator, currentValue) => accumulator + currentValue;
const result2 = array2.reduce(reducer);
console.log(result2); // 输出 15

在这个例子中,reduce 函数接受一个函数和一个可选初始值作为它的参数。该函数被用于将数组元素的值累加到一个单一的值中。

  1. 部分应用函数:部分应用函数是指一个函数接收一部分参数并返回一个新函数,该函数接收剩余的参数并返回结果。
const sum = (a, b, c) => a + b + c;
const partial = sum.bind(null, 1, 2);
console.log(partial(3)); // 输出 6

在这个例子中,bind 方法创建了一个新函数 partial,该函数接受一个参数©并返回 a、b 和 c 的和。我们没有给出所有的参数,而是只给出了 a 和 b,并使用 bind 方法“绑定”这些参数。

以上仅是高阶函数的简单示例,高级函数可以应用于多种情况,非常有用,可以帮助我们编写高效,灵活且可重用的代码。


http://www.ppmy.cn/news/85769.html

相关文章

异常处理机制

编程错误 编写程序时遇到的错误可大致分为 2 类,分别为语法错误和运行时错误。 语法错误 语法错误,也就是解析代码时出现的错误。当代码不符合Python语法规则时,Python解释器在解析时就会报出SyntaxError语法错误,与此同时还会…

数据结构学习之——线性表

1、线性表的定义和基本操作 1.1、线性表的定义 线性表是具有相同数据类型的n个数据元素的有限序列,其中n为表长,当n0时线性表是一个空表。若以L命名,则表示为 L ( a 1 , a 2 , , ⋯ , a i , a i 1 , ⋯ , a n ) L\left(a_{1}, a_{2,},\c…

Java String split()方法详细教程

Java String split方法详细教程 1、内部实现2、语法3、参数4、返回值5、抛出异常6、Java String split()方法示例7、Java String split()方法与正则表达式和长度示例8、Java String split()方法与正则表达式和长度示例2 Java String类的split()方法根据给定的正则表达式拆分字符…

SpringCloud Sleuth+Zipkin

SpringCloud SleuthZipkin 官网 https://github.com/spring-cloud/spring-cloud-sleuth Sleuth/Zipkin 是什么? 概述(两张图) 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用, 来协同产生最后的请求结果&#x…

SelFlow: Self-Supervised Learning of Optical Flow

本文提出了一种用于光流的自监督学习方法。该方法从非遮挡像素中提取可靠的流估计,并使用这些预测作为真值来学习幻觉遮挡的光流。 本文设计了一个简单的 CNN,以利用 来自多个帧的时间信息 来更好地进行流估计。本方法可以在 MPI Sintel、KITTI 2012 和 …

优维低代码实践:页面编排优化与数据联调

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 优维…

LLMs开源模型们的分布式训练和量化

前一篇博文整理了: LLMs开源模型们和数据集简介 这篇博文主要整理一下目前流行的训练方法和量化。 (图自Towards a Unified View of Parameter-Efficient Transfer Learning) Tuning Strategies 使通用LLMs适应下游任务的最常见方法是微调…

机器学习算法入门与编程实践课后题及答案(唐四新等编著)

目录 习题1 习题2 习题3 习题4 习题5 习题6 习题7 习题8 习题1 1.无监督学习的两个主要任务是(多选)(BD)。 A.回归 B.降维 C.分类 D.聚类 2.下列对无监督学习描述错误的是(C)。 A.无标签 B.核心是聚类 C.不需要降…