(# 纯函数)
纯函数(Pure Function)满足两个条件:
- 相同的输入总是得到相同的输出。
- 函数内部不产生副作用(不修改外部状态、I/O、全局变量等)。
下面通过示例说明什么是纯函数及如何避免副作用。
反例:非纯函数
该函数依赖外部变量 minAge,当外部变量变化时,输入相同但输出会不同,因此不是纯函数:
js
let minAge = 18;
function checkAge(age) {
return age >= minAge;
}
console.log('非纯函数 (minAge=18):', checkAge(20)); // true
minAge = 22;
console.log('非纯函数 (minAge=22):', checkAge(20)); // false正例:纯函数
纯函数只依赖于传入参数,不读取或修改外部状态:
js
function checkAgePure(age, limit) {
return age >= limit;
}
console.log('纯函数:', checkAgePure(20, 18)); // true
console.log('纯函数:', checkAgePure(20, 18)); // true副作用演示
下面展示一个会修改外部数组(有副作用)的函数,以及对应的纯函数写法(返回新数组):
js
// 非纯函数:修改传入数组(副作用)
const numbers = [1, 2, 3];
function pushNumber(arr, val) {
arr.push(val);
return arr;
}
pushNumber(numbers, 4);
console.log('副作用后的原数组:', numbers); // [1, 2, 3, 4]
// 纯函数:返回新数组,不修改原数组
const numbers2 = [1, 2, 3];
function addNumberPure(arr, val) {
return [...arr, val];
}
const newNumbers = addNumberPure(numbers2, 4);
console.log('原数组:', numbers2); // [1, 2, 3]
console.log('新数组:', newNumbers); // [1, 2, 3, 4]小结
- 优先通过参数传递和不可变数据结构来实现纯函数。
- 纯函数更易于测试、推理和组合,是函数式编程的基础。