纯函数的第二个特点: 没有任何可观察的副作用。
// 两个例子 解释副作用
const limit = 18 ;
const checkAge = age => age >= limit;
// 上面的例子是 不纯函数 因为limit 是全局变量,例如age=20; limit为18 是true , limit为22, 是false
const checkAgePure = age =>{
let limit = 18;
return age >= limit
}
// 上面的例子是 纯函数,但是 内部写了limit为18 。属于硬编码,这种方式不友好,可以通过柯理化解决
副作用 : 会让一个函数变的不纯,纯函数相同的输入会产生相同的输出。如果函数依赖于外部的状态 就无法保证输出相同,就会带来副作用。
副作用来源 : 外部状态、数据库、配置文件、用户输入…
所有的与外部交互都有可能带来副作用。副作用也是的方法的通用性下降,不适合拓展和可重用性。同时副作用会给程序带来安全隐患和不确定性。
但是副作用不可能完全禁止,尽可能控制他们在可控的范围内发生。