纯函数是全部函数式编程语言中使用的概念,这是一个很是重要的概念,由于它是函数式编程的基础,它容许你建立简单和复杂的组合模式。javascript
纯函数背后的数学术语我就不说了,我直接说说说它们是什么以及它们的样子。java
你能够肯定知足如下条件的函数是纯函数:git
以如下功能为例编程
Math.cos(0) // 1
复制代码
不管今天,明天仍是未来某个时间调用 Math.cos(0)
都不要紧,输出始终为1
。咱们来看一个新的例子
app
const numberOfApples = 5;
const applesBought = 5;
const add = (num1, num2) => num1 + num2;
const totalApples = add(numberOfApples, applesBought) // 10
const totalApples = add(numberOfApples, applesBought) // 10
// ... one month later
const totalApples = add(numberOfApples, applesBought) //10
复制代码
add函数也会发生一样的事情,无论调用该函数多少次或什么时候调用该函数,每次输出都相同。dom
如今,咱们来看一个随时间或每次调用而变化的函数:编程语言
Math.random() // 返回一个随机数
Math.random() // 返回一个不一样的随机数
// 一个月后
Math.random() // 返回一个不一样的随机数
复制代码
如你所见,每次调用 Math.random()
时,输出都会改变,所以咱们不能说 Math.random()
是纯函数。函数式编程
经过使用非纯函数,这个标准也很容易理解,因此让咱们看看非纯函数是什么样子的:函数
const numberOfApples = 5
const applesBought = 5
const addApplesToTotal = (num1) => numberOfApples + num1;
const totalApples = addApplesToTotal(applesBought); // 10
复制代码
从上一个示例能够看到,函数 addApplesToTotal
使用的是上面定义的变量,它不是传递 numberOfApples
的值,而是直接访问外部范围。所以,addApplesToTotal
不是自包含的。学习
与前面的标准同样,可使用非纯函数很好地演示这个标准。咱们来看一下 👀
let totalApples = 5
const applesBought = 5
const addApplesToTotal = () => {
totalApples += applesBought
};
addApplesToTotal()
复制代码
你能从前面的不纯函数中注意到什么?它打破了前面的两个标准!!
totalApples
的值。为何纯函数很重要?
纯函数是函数编程中一个基本但功能强大的概念。学习和习惯纯函数可使你更轻松地测试和调试代码。它们将容许你学习关于函数式编程的更复杂的知识。
来源:levelup.gitconnected.com,做者:Guillermo Martínez Espina