【函数式编程】函数式编程、纯函数、高阶函数以及函数柯里化

最近在学习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)都是高阶函数。

柯里化

柯里化有两个特点:

  1. 柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c )。
  2. 柯里化不会调用函数。它只是对函数进行转换。
    示例:
// 柯里化函数写法
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函数式编程指南

你可能感兴趣的:(javascript,前端,react.js)