纯函数 以及 柯里化

120 阅读2分钟

纯函数概念

  • 纯函数:相同的输入 会有相同的结果,而且没有任何可观察的副作用

    • 纯函数类似数学中的映射

    • lodash是一个纯函数的功能库,提供了对数组,字符串,对象,数字,函数等操作的一些方法。

    • slice和splice分别是纯函数和不纯函数

      • slice返回数组中的指定部分,不会改变原数组
      • splice 对数组进行删除,替换或者增加,会改变原数组
      •  ​
         let arr=[1,2,3,4,5,6]
                 console.log(arr.slice(1,4))  //[2, 3, 4]
                 console.log(arr.slice(1,4)) //[2, 3, 4]
                 console.log(arr.slice(1,4)) //[2, 3, 4]
                 
                 console.log(arr.splice(1,4)) //[2, 3, 4, 5]
                 console.log(arr.splice(1,4)) //[6]
                 console.log(arr.splice(1,4)) //[]
         //可以看出  slice 相同的输入  三次输出都相同
         //而 splice改变了原数组虽然两次都是相同的输入但是输出不同  所以是不纯的函数
        
  • 纯函数的好处

    • 可缓存

      • 因为纯函数相同的输入始终有相同的输出,所以可以把纯函数的结果缓存起来。
    • 可测试

      • 纯函数让测试更方便
    • 并行处理

      • 在多线程环境下并行操作共享的数据很可能会出现意外情况
      • 纯函数不需要访问共享的内存数据,所以在并行环境下可以任意运行纯函数(es6 Web worker)
  • 副作用

    • 副作用让一个函数变得不纯,纯函数的根据相同的输入返回相同的输出,如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用

    •  //不纯的
       let min=12;
       function little(arg){
           return age>=min
       }
      
    • 副作用的来源:

      • 配置文件
      • 数据库
      • 获取用户的输入...
    • 所有的外部交互都有可能带来副作用

柯里化

  • 柯里化 模拟
  •  function curry(fnc){
         return function curried(...args){
             //判断形参fnc和实参args的长度
             if(args.length>fnc.length){
                 return function(){
                     return curried(...args.concat(Array.from(arguments)))
                 }
             }
             return fnc(...args)
         }
     }
    
  • 柯里化 可以让我们传递较少的参数得到一个 已经记住了某些固定参数的新函数
  • 这是一种对函数参数的“缓存”
  • 让函数变得更灵活,让函数的粒度更小
  • 可以吧多元函数转换成一元函数,可以组合使用函数产生强大的功能

\