JavaScript函数式编程强调纯函数、不可变数据和函数组合,避免副作用与可变状态,借助高阶函数及工具如pipe/compose提升代码可读性、可测试性与复用性。

JavaScript 中的函数式编程(Functional Programming,FP)是一种编程范式,强调用纯函数、不可变数据和函数组合来构建程序,而不是依赖可变状态和命令式控制流。
纯函数(Pure Functions)
纯函数指:给定相同输入,永远返回相同输出,且不产生任何副作用(比如修改全局变量、发起网络请求、修改传入对象等)。
- ✅ 好例子:const add = (a, b) => a + b; —— 输入确定,无副作用
- ❌ 非纯函数:red">const now = () => Date.now(); 或 arr.push(x); —— 依赖外部状态或改变输入
不可变性(Immutability)
数据一旦创建就不能被修改。更新时应返回新对象/数组,而非直接更改原值。
- 避免:obj.name = 'Alice'; 或 arr[0] = 1;
- 推荐:const newObj = {...obj, name: 'Alice'}; 或 const newArr = [...arr, newItem];
- 工具辅助:可用 Object.freeze(浅冻结)、immer(安全写法)、或 lodash/fp 等库支持
高阶函数与函数组合
函数可以作为参数传入,也能作为返回值;多个小函数可组合成更强大的逻辑。
立即学习“Java免费学习笔记(深入)”;
- map、filter、reduce 是典型高阶函数
- 组合示例:const getNameLength = compose(length, get('name'));(需配合 compose 或 pipe 工具)
- ES6+ 可轻松实现:const pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);
避免共享状态与副作用
函数式编程尽量将副作用(如 I/O、DOM 操作、随机数、时间获取)集中隔离,保持核心逻辑可预测、易测试。
- 把副作用“推到边缘”:例如在 React 中,useEffect 就是管理副作用的边界
- 异步处理常用 Promise 或 async/await,但注意它们本身不是纯的——可通过封装(如 Task 类型)模拟纯异步流
- 日志、调试可用不影响逻辑的纯方式:const trace = label => x => (console.log(label, x), x);
基本上就这些。函数式编程在 JS 中不是非黑即白的选择,而是提供一套思维工具——用得恰当,代码会更清晰、更易复用、更少出错。











