什么样的函数是纯函数(Pure Functions)
纯函数是函数式编程的基础
-
相同的输入总是返回相同的输出:一个函数的返回值只依赖于它的参数值,无论将该函数放在什么环境或作用域中,对函数内部的运行都没有什么影响,其返回结果也是可预测的。因此,纯函数也更便于迁移
举个栗子便于理解:
有个现金盲盒机,抽一次需要¥50。二狗花了¥50抽了一个盲盒,发现只抽到了¥10。(心塞塞)
const cost = 50;
const getSurprise = cost => 10;
console.log(getSurprise(cost)); // 10
二狗不甘心,又拿出了¥50抽了一个,结果还是¥10。。。后来才知道,这个现金盲盒机的背后是一个无良商家,每个盲盒里都只放了¥10。
过了一段时间,二狗又遇到了一个现金盲盒机,他看见前面的大狗开心地狗言狗语道:“赚啦赚啦~”,心想这次应该不会遇到无良商家了吧,于是打算再试一次。
const cost = 50;
const getSurprise = cost => Math.floor((Math.random()*100)+1);
console.log(getSurprise(cost)); // 76
结果,他抽到了¥76,很开心,接着又抽了一个
console.log(getSurprise(cost)); // 51
又抽了一个
console.log(getSurprise(cost)); // 2
又抽了一个
console.log(getSurprise(cost)); // 43
......
最后,他没钱了...
从上个栗子可以发现,当函数中进行类似Math.random()
这样的操作时,导致返回值是不固定的,这样的函数就不是纯函数
- 不依赖于外部的状态:当函数依赖于外部的变量时,该函数的返回值就是不可预测的,会因受到外部变量的影响而改变。纯函数不能依赖于函数以外的任何状态。
// 我是栗子
var x = 10;
const foo = number => number + x;
console.log(foo(20)); // 30
x = 20;
console.log(foo(20)); // 40
函数foo依赖于外部的x,当x发生改变时,输入同样的参数20,其返回结果不同。这样的函数也不是纯函数
改装一下:
const foo = number => {
var x = 10;
return number + x;
}
console.log(foo(20)); // 30
console.log(foo(20)); // 30
- 不会产生任何副作用:纯函数不会对外部产生任何影响,不会改变任何外部状态,如改变全局变量、参数等。
const apple = {
color: 'green'
};
// 我不纯
const bar = param => {
param.color = 'red';
};
bar(apple);
console.log(apple.color); // red
优点
- 简单、易于调试
- 便于迁移,更灵活
- 便于重构和重组
- 易于并行
以上,笔芯