(1)如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。
(2)该函数不会产生任何可观察的副作用,例如网络请求,输入和输出设备或数据突变(mutation)。
这就是纯的函数。 如果一个函数符合上述 2 个要求,它就是纯函数。
纯函数在函数式编程中被大量使用。诸如 ReactJS 和 Redux 等优质的库都使用了纯函数。
一个可以被观察的副作用是在函数内部与其外部的任意交互。这可能是在函数内修改外部的变量,或者在函数里调用另外一个函数等。
注: 如果纯函数调用纯函数,则不产生副作用依旧是纯函数。
副作用来源(但不限于):
-
进行一个 HTTP 请求
-
Mutating data
-
输出数据到屏幕或者控制台
-
DOM 查询/操作
-
Math.random()
-
获取的当前时间
纯函数的例子
function priceAfterTax(productPrice) {
return (productPrice * 0.20) + productPrice;
}
它符合我们所说的两条纯函数的定义。不依赖于任何外部输入,不改变任何外部数据、没有副作用。
即使你用同样的输入运行运行这个函数 100,000,000 次它依旧产生同样的结果。
非纯函数的例子
var tax = 20;
function calculateTax(productPrice) {
return (productPrice * (tax/100)) + productPrice;
}
其中函数的计算结果取决于外部 tax 变量,而纯函数不能依赖外部变量。它没有满足定义中的第一个要求,因此这个函数是不纯的。
- 方便测试
使用纯函数的一个主要好处是它们可以直接测。 如果传入相同的参数,它们将始终产生相同的结果。 - 方便维护和重构
正确地使用纯函数可以产生更加高质量的代码