纯函数的定义
如果一个函数内部无任何副作用代码,且输入确定一定会有确定的输出,且输出依赖输入,这样的函数我们称为纯函数
接下来解读以上定义
何为副作用?
-
异步代码 比如 ajax请求,setTimeOut 等
-
有影响外部的代码。比如
let a = 10;
function test(){
a=20;
}
- 有影响传入参数的。比如
let obj = {
name:"teacher.ou",
age:18
}
function noPure(obj){
obj.name = "respect"
}
- 唯一的输入没有对应唯一的输出
function noPure(a){
return Math.random()*a;
}
- 唯一输出跟输入没关系的
function noPure(a){
return Math.random();
}
纯函数这么麻烦。为何还要使用
-
对开发友好,这样的函数一般很难有bug
-
压缩工具terser(网址:terser.org) 有关,纯函数在terser 的压缩下体积更小,比如
let a = 1;
let b = 2;
function test(c,d){
return c+d
}
console.log(test(a,b))
类似这种代码在开启 toplevel:true这个时 最后压缩为 console.log(1+2);
因为webpack 在打包生产环境已经内置了terser压缩,所以我们再开发中书写纯函数,这样打包的体积会更小,更小意味着请求更快,也是webpack 性能优化的一部分
有人问我?如果一个函数内部只是有一个setTimeout,并且里面没有任何代码实现,这样的函数是纯函数吗?
function Test(a,b){
setTimeOut(()=>{
},0)
return a+b
}
因为纯函数的返回值应该是同步的,所以对于该函数来说,这个setTimeout几乎没任何作用,没任何作用的代码基本就是废物代码,对于纯函数来说,所有操作应该是跟最终返回值相关,而返回值是同步的,所以上面函数不是纯函数。