纯函数满足以下条件:
1.相同的输入总会返回相同的输出
2.不产生副作用
3.不依赖外部状态
eg:
example.jpeg1.纯函数
以下是一个计算产品税后价格(英国税率是20%)的纯函数的例子:
function priceAfterTax(productPrice) {
return (productPrice * 0.20) + productPrice;
}
它符合我们所说的两条纯函数的定义。不依赖于任何外部输入,不改变任何外部数据、没有副作用。
2.非纯函数
var tax = 20;
function calculateTax(productPrice) {
return (productPrice * (tax/100)) + productPrice;
}
其中函数的计算结果取决于外部 tax 变量,而纯函数不能依赖外部变量。
它没有满足定义中的第一个要求,因此这个函数是不纯的。
纯函数的优点:
1.复用性强
2.可测试性强
3.并行代码
即相同输入,永远会得到相同输出,而且没有任何可观察的副作用。如果使用了 setTimeout 、Promise 或更多具有意外情况发生的操作。那么这类操作被称之为 "副作用" Effect。
每一个函数都可以被看做独立单元。纯函数的好处:方便组合、可缓存、可测试、引用透明、易于并发等等。
// 不纯的, minimum 可能被其他操作改变
let minimum = 21;
function checkAge(age) {
return age >= minimum;
}
// 纯的
function checkAge(age) {
const minimum = 21;
return age >= minimum;
}
比如 slice 和 splice, slice 符合纯函数的定义是因为对相同输入它保证能返回相同输出。而 splice 却会改变调用它的数组,这就会产生可观察到的副作用,即这个原始数组永久地改变了。
var countList = [1, 2, 3, 4, 5];
// 纯的
countList.slice(0, 3);
//=> [1, 2, 3]
countList.slice(0, 3);
//=> [1, 2, 3]
// 不纯的
countList.splice(0, 3);
//=> [1, 2, 3]
countList.splice(0, 3);
//=> [4, 5]
网友评论