纯函数是JavaScript函数式编程的地基,必须同时满足“只依赖输入参数”和“不修改外部状态或输入本身”两个条件,且相同输入必得相同输出、无任何可观察副作用。

JavaScript 函数式编程不是写一堆 map 和 filter 就算数,核心是用纯函数组织逻辑、避免副作用、让数据流可预测。纯函数是它的地基,但很多人一上手就栽在“看似纯、实则不纯”上。
什么是纯函数:两个硬性条件必须同时满足
纯函数只依赖输入参数,且不修改外部状态或输入本身。只要参数相同,返回值一定相同,且不产生任何可观察的副作用。
常见错误现象:Array.prototype.sort() 改变了原数组,JSON.parse() 对非法 JSON 抛错(错误也是副作用),new Date() 或 Math.random() 每次调用结果不同——这些都不能出现在纯函数体内。
- ✅ 正确示例:
const add = (a, b) => a + b; const capitalize = str => str.charAt(0).toUpperCase() + str.slice(1);
- ❌ 错误示例:
const badSort = arr => arr.sort(); // 修改了 arr const badNow = () => Date.now(); // 外部时间状态不可控
- ⚠️ 容易忽略:对象/数组参数默认是引用传递,
obj.name = 'x'或arr.push(1)就已破坏纯度,需用{...obj}或[...arr]浅拷贝,深层结构要用structuredClone或专用库
如何识别和修复非纯函数:从调试痕迹反推
当函数行为不稳定(比如测试时偶尔失败、React 组件重渲染异常、Redux reducer 更新出错),大概率是纯度被破坏。重点检查三类“隐性污染源”:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
立即学习“Java免费学习笔记(深入)”;
- 闭包中捕获了外部可变变量(如
let count = 0; const inc = () => ++count;)→ 改为参数传入或用useRef/useState显式管理状态 - 调用了带副作用的 API(
fetch、localStorage.setItem、console.log)→ 抽离到函数外部,纯函数只负责返回要执行的“描述”,例如返回{ type: 'FETCH_USER', id: 123 }而非直接发请求 - 使用了
this或依赖运行时上下文(如function foo() { return this.x; })→ 改为箭头函数或显式传参,消除隐式绑定
实践纯函数的最小可行路径:从工具函数开始
别一上来就重构整个项目。先锁定高频、低耦合、无状态的逻辑块,比如格式化、计算、校验类函数。这类函数天然适合纯化,也最容易验证正确性。
- 优先改造:
formatCurrency、isValidEmail、getFullName、calculateTotal—— 它们本就不该有副作用 - 参数设计原则:避免
options对象里塞一堆布尔开关,拆成明确命名的参数;复杂输入用解构 + 默认值,比如const buildUrl = ({ host = 'api.example.com', path, query = {} }) => `${host}/${path}?${new URLSearchParams(query)}`; - 性能注意点:频繁浅拷贝大对象或长数组会触发 GC,纯度优先但不盲目拷贝——如果能保证调用方不复用输入对象,可加注释说明“此函数要求输入不可变”,把契约交给协作方
纯函数不是银弹,它解决的是“为什么这段代码在 A 场景正常、B 场景崩溃”的困惑。真正难的不是写 x => x * 2,而是坚持不让 console.log 或 localStorage 偷溜进你的计算逻辑里——哪怕只有一行。










