Skip to content

(# 纯函数)

纯函数(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]

小结

  • 优先通过参数传递和不可变数据结构来实现纯函数。
  • 纯函数更易于测试、推理和组合,是函数式编程的基础。

MIT Licensed | Keep Learning.