「纯函数」是啥?
在 JavaScript(或者任何编程语言)中:
纯函数(Pure Function) 是指:相同的输入永远会得到相同的输出,且没有任何副作用 的函数。
✅ 一个纯函数的两个特点:
- 相同输入 => 相同输出
- 没有副作用(No Side Effects):
- 不修改外部变量
- 不读写文件
- 不访问数据库
- 不修改 DOM
- 不使用随机数或
Date.now()
这类不确定的东西
举个例子(纯函数):
function add(x, y) {return x + y;
}
- 相同输入
(2, 3)
永远输出5
- 没有访问外部的东西,也没修改外部状态
❌ 举个非纯函数的例子:
let a = 10;function addToA(x) {return x + a;
}
- 这个函数用了外部的
a
- 如果
a
改变了,输出也会变 —— 所以这不是纯函数 ❌
📌 你问的重点:“函数内部只能用函数内部的值?”
不是「必须」,而是说:
如果你想写纯函数,那你就不能依赖函数外部的变量。
但有时候你 不需要写纯函数,那就可以用外部变量。
🎯 总结一句话:
纯函数是一种「干净、可预测」的写法,只使用输入参数,不依赖也不修改外部的任何东西。
为什么纯函数其实很有用?
1. 调试容易
你只要看输入就知道输出,根本不用管外面发生了啥。
function getUserAge(user) {return 2025 - user.birthYear;
}
- 这就是纯函数
- 一眼看懂,也不怕被别的地方影响
2. 测试方便
写测试不用准备一堆外部变量,只要传入参数就行。
console.log(getUserAge({ birthYear: 2000 })) // 总是输出 25
3. 不会莫名其妙出 bug
比如下面这种非纯函数
let total = 0;function add(x) {total += x;
}
你可能某天忘了 total
是全局的,结果某个地方一改,所有调用都崩了
4. 配合函数式编程
像 .map()
、.filter()
、.reduce()
这些方法
实战纯函数例子1:处理表单数据
function formatUserInput(name, email) {return {name: name.trim(),email: email.toLowerCase().trim()};
}
不依赖外部值
传啥给你就改啥,输出可预测,调试容易
例子2:计算折扣价格
function getDiscountPrice(price, discountRate) {return price * (1 - discountRate);
}
不动任何全局变量
在任何地方调用都能保证结果对得起输入
例子3:格式化时间(输入 timestamp,输出字符串)
function formatDate(timestamp) {const date = new Date(timestamp);return `${date.getFullYear()}-${date.getMonth()+1}-${date.getDate()}`;
}
💡 这个也基本算纯函数(只要你不给它 Date.now() 这种不确定的东西)