浅谈纯函数

277 阅读1分钟

纯函数的定义

如果一个函数内部无任何副作用代码,且输入确定一定会有确定的输出,且输出依赖输入,这样的函数我们称为纯函数

接下来解读以上定义

何为副作用?

  • 异步代码 比如 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几乎没任何作用,没任何作用的代码基本就是废物代码,对于纯函数来说,所有操作应该是跟最终返回值相关,而返回值是同步的,所以上面函数不是纯函数。