纯函数

什么样的函数是纯函数(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

优点

  • 简单、易于调试
  • 便于迁移,更灵活
  • 便于重构和重组
  • 易于并行

以上,笔芯

你可能感兴趣的:(纯函数)