什么是纯函数
在编程世界里,稳定且没有副作用的函数可以被称为纯函数。
-
稳定
-
不管何时何地,相同的输入,应始终得到相同的输出
-
返回值的计算过程不依赖于外部变量
-
-
没有副作用
- 函数执行过程中不会改变外部应用状态
稳定
不管何时何地,相同的输入,应始终得到相同的输出
👍 Good - 稳定
const goodAdd = (a, b) => a + b;
goodAdd(1, 2); // 3
goodAdd(1, 2); // 3
goodAdd(1, 2); // 3
goodAdd(1, 2); // 3
goodAdd(1, 2); // 3
// ✅ 相同的输入始终得到相同的输出
💩 Bad - 不稳定
const badAdd = (a, b) => Date.now() + a + b;
badAdd(1, 2); // 1621960359124
badAdd(1, 2); // 1621960359940
badAdd(1, 2); // 1621960360645
badAdd(1, 2); // 1621960361327
badAdd(1, 2); // 1621960362055
// ❌ 相同的输入,却得到不同的输出
返回值的计算过程不依赖于外部变量
👍 Good - 稳定
let totalValue = 999;
const goodAddToTotal = (total, addend) => total + addend;
goodAddToTotal(999, 1); // 1000
totalValue = 1000;
goodAddToTotal(999, 1); // 1000
// ✅ 不依赖于外部变量
💩 Bad - 不稳定
let totalValue = 999;
const badAddToTotal = (addend) => totalValue + addend;
goodAddToTotal(1); // 1000
totalValue = 1000;
goodAddToTotal(1); // 1001
// ❌ 依赖于外部变量
没有副作用
函数执行过程中不会改变外部应用状态
👍 Good - 没有副作用
let age = 17;
const goodIncreaseAge = (originAge, addend) => originAge + addend;
const currentAge = goodIncreaseAge(age, 1);
// currentAge = 18
// age = 17
// ✅ 不改变外部应用状态
const user = { age: 17 };
const goodUpdateUserAge = (user) => {
let currentAge = user.age;
return { age: currentAge + 1 };
};
const currentUser = goodUpdateUserAge(user);
// currentUser = { age: 18 }
// user = { age: 17 }
// ✅ 不改变外部应用状态
💩 Bad - 有副作用
let age = 17;
const badIncreaseAge = (addend) => age = age + addend;
const currentAge = badIncreaseAge(1);
// currentAge = 18
// age = 18
// ❌ 改变了外部应用状态
const user = { age: 17 };
const badUpdateUserAge = (user) => {
user.age = user.age + 1;
};
badUpdateUserAge(user);
// user = { age: 18 }
// ❌ 改变了外部应用状态