纯函数是函数式编程的基石,指相同输入恒得相同输出且无副作用的函数;它提升可测试性、缓存性、调试性、并发安全性与重构信心,实践中需隔离副作用、组合纯函数、善用高阶函数与柯里化。

JavaScript 可以自然地支持函数式编程,关键在于避免副作用、用纯函数组织逻辑、把函数当值来传递和组合。纯函数是函数式编程的基石,它让代码更可预测、易测试、易调试,也更容易做并发和缓存优化。
什么是纯函数?
纯函数满足两个条件:
- 相同输入,永远返回相同输出(不依赖外部状态,比如全局变量、Date.now()、Math.random());
- 不产生副作用(不修改传入参数、不改写全局变量、不发请求、不操作 DOM、不调 console.log)。
✅ 正确示例:
const add = (a, b) => a + b;const getFullName = (user) => `${user.firstName} ${user.lastName}`;
❌ 非纯函数示例:
let counter = 0;const increment = () => ++counter; // 依赖并修改外部变量
const mutateUser = (u) => {
u.age++; // 修改了原对象
return u;
};
如何在 JS 中实践函数式编程?
不是要完全抛弃命令式写法,而是有意识地提取纯逻辑、隔离副作用、组合小函数:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
立即学习“Java免费学习笔记(深入)”;
- 用 const 声明函数和数据,避免意外重赋值;
-
用展开语法或 Object.assign 替代直接修改对象,比如
{...user, age: user.age + 1}; - 把副作用“拎出来”单独处理:纯函数只负责计算,由外层决定何时调用 API、更新 UI;
- 善用高阶函数:如 map/filter/reduce、compose、pipe,把多个纯函数串起来;
-
用柯里化拆分参数,提升复用性,例如
const addX = x => y => x + y; const add5 = addX(5);。
纯函数带来的实际好处
这些不是理论优势,而是日常开发中能立刻感受到的收益:
- 可测试性极强:不用 mock 全局状态或时间,给输入就能断言输出;
- 便于缓存(记忆化):因为输入输出一一对应,可以用 Map 缓存结果,避免重复计算;
- 利于调试与追踪:出问题时,只需检查当前函数的输入,无需回溯整个执行链;
- 天然适合并行/并发:没有共享状态竞争,多个纯函数可安全同时运行;
- 提升重构信心:只要签名不变,内部怎么改都不影响调用方行为。
注意边界:JS 不是纯函数式语言
JavaScript 允许任何写法,所以函数式是选择,不是强制。真实项目中,I/O、用户交互、状态管理必然含副作用。关键是:
- 把计算逻辑抽成纯函数(比如格式化、校验、转换);
- 让副作用集中、显式、可控(比如统一放在 useEffect、事件回调或 service 层);
- 利用工具辅助识别非纯行为(如 ESLint 插件 eslint-plugin-functional)。










