📜  JavaScript 中的函数式编程(1)

📅  最后修改于: 2023-12-03 15:01:40.409000             🧑  作者: Mango

JavaScript 中的函数式编程

函数式编程是一种编程范式,它强调函数的纯粹性和不可变性,并鼓励使用不可变数据。JavaScript 中的函数式编程使用一些不同的方式来评估函数。这篇文章将介绍 JavaScript 中的函数式编程,包括其核心概念和一些最佳实践。

核心概念
纯函数

纯函数是指在给定相同的输入时,始终返回相同的输出,并且没有副作用。副作用指的是任何会影响系统状态的事情,例如更改数据库、改变全局状态等。

下面是一个纯函数的例子:

function add(a, b) {
  return a + b;
}

这个函数给定相同的输入时,总是返回相同的输出。它也没有副作用。

高阶函数

高阶函数是指将一个或多个函数作为参数或返回另一个函数的函数。这种函数可以使代码更有表现力和可重用性。

下面是一个高阶函数的例子:

function withCount(fn) {
  let count = 0;

  return function(...args) {
    count++;
    console.log(`函数 ${fn.name} 被执行了 ${count} 次`);
    return fn(...args);
  }
}

function add(a, b) {
  return a + b;
}

const withCountAdd = withCount(add);

withCountAdd(1, 2); // 函数 add 被执行了 1 次 3
withCountAdd(3, 4); // 函数 add 被执行了 2 次 7

withCount 接收一个函数作为参数,并返回一个新的函数,该函数记录了该函数调用的次数。

不可变性

不可变性指的是数据不会被修改。在 JavaScript 中,对象和数组是可变的。为了实现不可变性,我们通常使用纯函数来创建新的对象和数组,并将原始对象和数组保持不变。

下面是一个实现不可变性的例子:

const numbers = [1, 2, 3, 4, 5];

function double(numbers) {
  return numbers.map(n => n * 2);
}

const doubledNumbers = double(numbers);

console.log(numbers); // [1, 2, 3, 4, 5]
console.log(doubledNumbers); // [2, 4, 6, 8, 10]

double 函数接收一个数组,并返回一个新数组,该数组每个元素都是原始数组中每个元素的两倍。原始数组保持不变。

最佳实践
函数组合

函数组合是将一个或多个函数按特定顺序组合成一个函数的过程。

下面是函数组合的一个例子:

function add1(a) {
  return a + 1;
}

function double(a) {
  return a * 2;
}

const add1Double = x => double(add1(x));

console.log(add1Double(2)); // 6

add1Double 函数将 add1double 组合成了一个新函数。

柯里化

柯里化是指将一个接受多个参数的函数转换为一系列接受单个参数的函数的过程。

下面是柯里化的一个例子:

function add(a) {
  return function(b) {
    return a + b;
  }
}

const add1 = add(1);
console.log(add1(2)); // 3

add 函数返回一个函数,该函数接收一个参数并返回两个参数的和。我们可以使用 add 函数来创建一个新函数 add1,该函数接受一个参数并将其加上 1。

结论

JavaScript 中的函数式编程是一种强调纯函数、高阶函数和不可变性的编程范式。它具有许多优点,例如可重用性、可组合性和易于测试性。我们可以通过使用函数组合、柯里化和其他技术来使我们的代码更有表现力和可维护性。