概念:
相同的输入永远会得到相同的输出,且没有任何可观察的副作用
纯函数就类似数学中函数(用来描述输入和输出之间的关系)例如y=f(x)
举例
数组中的slice和splice分别是纯函数和不纯的函数
纯函数
console.log(arr1.slice(0, 3)); //[1,2,3]
console.log(arr1.slice(0, 3)); //[1,2,3]
console.log(arr1.slice(0, 3)); //[1,2,3]
function getSum(num1, num2) {
return num1 + num2
}
console.log(getSum(1, 11)); //12
console.log(getSum(1, 11)); //12
console.log(getSum(1, 11)); //12
不纯的函数
console.log(arr1.splice(0, 3)); //[1,2,3]
console.log(arr1.splice(0, 3)); //[4,5]
console.log(arr1.splice(0, 3)); //[]
函数式编程中不会保留计算中间的结果,所以变量是不可变的(无状态的)
可以把一个函数的执行结果交给另一个函数去处理
纯函数的好处
可以缓存,因为纯函数对相同的输入始终有相同的结果,所以可以把函数的结果缓存起来
//记忆函数
let getAreaWidthMemory = _.memoize(getArea)
console.log(getAreaWidthMemory(4));
console.log(getAreaWidthMemory(4));
console.log(getAreaWidthMemory(4));
console.log(getAreaWidthMemory(4));
//结果
// 4
// 50.26548245743669
// 50.26548245743669
// 50.26548245743669
// 50.26548245743669
模拟momoize函数
function memoize(f) {
let cache = {};
return function(param) {
let key = JSON.stringify(arguments);
cache[key] = cache[key] || f.apply(f, arguments)
return cache[key]
}
}
let getAreaWidthMemory = memoize(getArea)
console.log(getAreaWidthMemory(4));
console.log(getAreaWidthMemory(4));
console.log(getAreaWidthMemory(4));
console.log(getAreaWidthMemory(4));
结果如下
4
50.26548245743669
50.26548245743669
50.26548245743669
50.26548245743669
纯函数的弊端
弊端指的是让函数变得不纯,纯函数的根据相同的输入返回相同的输出,
如果函数依赖于外部的状态就无法保证输出相同就会出现问题
外部的状态来源
1、配置文件
2、数据库
3、获取用户的输入
//不纯函数
let mini = 18
function checkAge(age) {
return age >= mini
}
//纯函数(有硬编码)后续可以通过柯里化解决
function checkAge(age) {
let mini = 18
return age >= mini
}
所有的外部交互都有可能带来问题,这样也使得方法通用性、扩展性 和可重用性下降,
同时也会给程序带来安全隐患,给程序带来不确定性,
但是外部的状态不可避免,尽可能控制它们在可控范围内发生
谢谢观看