最近在学习React,看到了高阶函数以及函数柯里化等概念,因为对这些内容还比较生疏,于是查找了资料,发现都跟一个叫函数式编程的思想有关,于是搜集各方资料,稍微系统性地做了点自己的记录用于以后的复习。想要更系统性地学习可以翻阅这个文档:JS函数式编程指南,写得十分详细。
函数式编程是一种编程范式,它将计算过程视为一系列的函数调用。
函数在函数式编程中被视为一等公民,这意味着函数可以作为参数传递,也可以作为返回值返回。这与我们在传统的过程式或面向对象编程中看到的明显不同,其中主要关注的是变量的状态变化和对象的行为。
面向对象编程(OOP)和函数式编程(FP)是当前最主流的两种编程范式。面向对象编程以对象作为基本单位,强调对象之间的交互和状态变化。而函数式编程以函数为基本单位,强调的是数据的映射关系,尽可能地避免状态变化。
这两种编程范式各有优点,也有很多现代编程语言如Java、Python、JavaScript等都同时支持这两种编程范式。在实际的编程中,我们通常会结合使用这两种编程范式,根据问题的特性选择最适合的方法。
纯函数是一种函数,其输出只由输入决定,并且在运行过程中不产生任何副作用。
这里的副作用指的是函数对外部环境的任何改变,包括但不限于改变全局变量、修改输入参数、执行I/O操作等。
例如,下面的JavaScript函数就是一个纯函数
function add(x, y) {
return x + y;
}
纯函数有许多优点。首先,纯函数的行为是可预测的,因为给定相同的输入,纯函数总是返回相同的输出。其次,由于纯函数不产生副作用,它们不会改变程序的状态,这使得代码更容易理解和测试。
高阶函数是将函数用作参数或者返回值的函数
高阶函数是函数式编程的核心,因为它们提供了一种强大的抽象机制,可以帮助我们编写更灵活和可重用的代码。
例如,下面的JavaScript函数就是一个高阶函数:
function greaterThan(n) {
return m => m > n;
}
let greaterThan10 = greaterThan(10);
console.log(greaterThan10(11)); // 输出:true
高阶函数的一个主要用途是创建可配置的函数。在上面的例子中,我们使用greaterThan函数创建了一个新的函数greaterThan10,这个新的函数可以检查一个数是否大于10。
高阶函数也常常用于抽象出重复的代码。例如,我们可以创建一个高阶函数map,它接收一个函数和一个数组,然后应用这个函数到数组的每个元素:
function map(func, array) {
let result = [];
for (let item of array) {
result.push(func(item));
}
return result;
}
高阶函数在许多函数式编程语言和库中都有广泛的应用。例如,在JavaScript的Array类中,许多方法(如map、filter和reduce)都是高阶函数。
柯里化有两个特点:
// 柯里化函数写法
function add(x) {
return function(y) {
return x + y;
};
}
// 调用柯里化函数
const add5 = add(5);
console.log(add5(3)); // 8
console.log(add5(7)); // 12
add() 函数被柯里化为两个函数:一个是接收一个参数 y 的函数,返回 x + y;另一个是接收两个参数 x 和 y 的函数,返回 x + y。
柯里化,不可变数据类型,纯函数等都是函数式编程中的概念。在React中这些概念很常见,因为React中很多涉及到函数式编程的概念。想要具体了解什么是函数式编程,可以查看JS函数式编程指南