1.纯函数概念
函数式编程中有一个概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念。
- 在react开发中纯函数是被多次提及的;
- react中组件被要求像是一个春寒苏,redux中有一个reducer的概念,也是要求必须是一个纯函数;
- 所以掌握纯函数对于理解很多框架的设计是非常有帮助的;
纯函数的维基百科定义:
- 在程序设计中,若一个函数符合以下条件,那么这个函数被称为纯函数:
- 此函数在相同的输入值时,产生相同的输出;
- 函数的输出与输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关;
- 该函数不能有语义上可观察的函数副作用,诸如“触发事件”,是输出设备输出,或更改输出值以外物件的内容。
总结:
- 确定的输出,一定会产生确定的输出;
- 函数在执行过程中,不能产生副作用。
1.2.副作用概念的理解
副作用(side effect)其实本身是医学的一个概念,比如我们经常说吃什么药是为了治病,可能会产生一些副作用;
在计算机科学中,也引用了副作用的概念,表示在执行一个函数时,除了返回函数值之外,还对调用函数产生了附加的影响, 比如修改了全局变量,修改参数或者改变外部的存储;
纯函数在执行的过程中就是不能产生副作用,副作用往往是产生bug的温床。
2.纯函数的案例
一个对数组操作的两个函数,看一下哪些是纯函数:
- slice:slice截取数组时不会对原数组进行任何操作,而是生成一个新的数组;
- splice:splice截取数组,会返回一个新的数组,也会对原数组进行修改;
slice是一个纯函数,不会修改数组本身,而splice函数不是一个纯函数。
var name = ["aaa", "bbb", "ccc"]
var newName = name.slice(0, 2)
console.log(newName)
var newName2 = name.splice(0, 2)
console.log(newName2)
console.log(name)//原数组会被修改
function sum(num1, num2) {
return num1 + num2
}
//纯函数,有确定的输出值,并且没有外部引用。
let foo = 5
function add(num){
return foo + num
}
console.log(add(5))
foo = 10
console.log(add(5))
//不是纯函数,引用了外部变量
function printInfo(info) {
console.log(info.name, info.age)
info.name = "哈哈哈哈哈哈哈" //修改了对象的值,不是一个纯函数
}
3.纯函数的作用和优势
使用纯函数就可以安心编写和安心使用;
- 你在写的时候保证了函数的纯度,只是单纯实现自己的业务逻辑即可,不需要关心传入的内容是如何获得的或者依赖其他的 外部变量是否已经发生了修改;
- 你在用的时候,你确定你的输入内容不会被任意篡改,并且自己确定的输入,一定会有确定的输出;