16. 纯函数、副作用与函数式编程初识 副本.md

查看飞书原文 ↗3,470 字符

1. 核心概念 (Core Concept)

2. 为什么需要它? (The "Why")

3. API 与用法 (API & Usage)

纯函数本身不是一个具体的 API,而是函数的一种属性或一种编写函数的方式。函数式编程也没有特定的内置 API(在通用编程语言如 JavaScript 中),它更多是一种编程风格和思想。

纯函数的例子(JavaScript):

// 纯函数:给定相同的输入 (a, b),总是返回相同的输出 (a + b),没有副作用。
function add(a, b) {
  return a + b;
}

// 非纯函数的例子 (含有副作用):
// 例子 1: 依赖外部状态
let count = 0;
function incrementAndGet() {
  count++; // 修改外部变量,副作用
  return count;
}

// 例子 2: 修改传入的参数 (如果参数是引用类型)
function modifyArray(arr) {
  arr.push(1); // 修改了函数外部的数组,副作用
  return arr;
}

// 例子 3: 进行 I/O 操作
function logMessage(message) {
  console.log(message); // 写入到控制台,副作用 (尽管这是常见的操作)
}

// 例子 4: 读取外部状态
function getRandomNumber() {
  return Math.random(); // 依赖 Math 的内部状态(或者说依赖时间等外部因素),每次结果不同,非纯函数
}

在函数式编程中,我们通常会结合使用高阶函数(Higher-Order Functions,如 map, filter, reduce)和纯函数来处理数据:

// 使用纯函数和高阶函数处理数组
const numbers = [1, 2, 3, 4, 5];

// 使用 map (高阶函数),传入一个纯函数 (num => num * 2)
// map 本身是纯的,它返回一个新数组,不修改原数组
const doubledNumbers = numbers.map(num => num * 2); // [2, 4, 6, 8, 10]

// 使用 filter (高阶函数),传入一个纯函数 (num => num > 2)
// filter 本身是纯的,它返回一个新数组
const greaterThanTwo = numbers.filter(num => num > 2); // [3, 4, 5]

// 使用 reduce (高阶函数),传入一个纯函数 ((acc, num) => acc + num)
// reduce 本身是纯的,它返回一个单一值
const sum = numbers.reduce((acc, num) => acc + num, 0); // 15

console.log("Original:", numbers); // [1, 2, 3, 4, 5] - 原数组未被修改
console.log("Doubled:", doubledNumbers);
console.log("Filtered:", greaterThanTwo);
console.log("Sum:", sum);

4. 关键注意事项 (Key Considerations)

5. 参考资料 (References)



原文链接与附件索引