纯函数的理解
什么是纯函数?
一个函数的执行结果只依赖它的参数,并且在执行过程中没有副作用,这就是纯函数
1、返回的结果只依赖它的参数,输入一定输出也一定
示例:
var a = 2
const test = (b) = > a + b
test(1) //3
有人说这是纯函数,只要传参一定输出结果也是一定的,这种是错误的
因为test它的输出结果取决于 外部的a 和 传入的参数,我们在不知道a 的情况下是不能保证test(b)的返回值的,现在test(1)返回的结果是3,但是过一会可能就不是3了,
有人问为什么?因为a可能会发生变化啊,a只是声明的变量,如果a的值被改变,而你还是调用了test(a)(你不知道a变化了,或者没有想到a还在影响着test,就又给a赋值了),
那么test(1)的输出结果就不是3了
如果是这样
const test = (b) = >{
const a = 1
return a + b
}
那么这时候才是 输入一定输出也一定 也印证:返回的结果只依赖它的参数
2、函数执行过程没有副作用
副作用:一个函数执行过程产生了外部可观察的变化
示例:
const test = (a , b) => {
return a.c + b
}
const a = { c : 1 }
test(a , 1) // 2
这时候它是纯函数
但是如果:
const test = (a , b) => {
a.c = 2
return a.c + b
}
const a = { c : 1 }
test(a , 1) // 3
这时候这个函数就不纯了,因为在test函数执行的时候对外部的a产生了影响(产生了副作用),它修改了外部传进来的对象,现在它不纯了
当然你要纯函数也可以这样写
const test = ( b) => {
var a = { c : 1 }
a.c = 2
return a.c + b
}
test(1) // 3
test在内部修改了a,但是a是内部变量,外部的程序根本观察不到(修改a并不会产生外部可观察的变化)
另:调用 DOM API 修改页面,或者你发送了 Ajax 请求,还有调用 window.reload 刷新浏览器,甚至是 console.log 往控制台打印数据也是副作用
纯函数很严格,也就是说你几乎除了计算数据以外什么都不能干,计算的时候还不能依赖除了函数参数以外的数据

浙公网安备 33010602011771号