纯函数的理解

什么是纯函数?

  一个函数的执行结果只依赖它的参数,并且在执行过程中没有副作用,这就是纯函数

  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 往控制台打印数据也是副作用

    纯函数很严格,也就是说你几乎除了计算数据以外什么都不能干,计算的时候还不能依赖除了函数参数以外的数据

 

posted @ 2021-03-25 16:13  HandsomeGuy  阅读(248)  评论(0)    收藏  举报