函数式编程

纯函数(pure function)

  1. 定义:
    (1) 相同的输入产生相同的结果

    详解:入参类型相同且 return 的值格式相同,如果给定相同的参数,则得到相同的结果 ,有输入就一定有输出

    (2) 不会产生副作用

    详解:不会影响其它作用域的变量的值,不会更改页面的显示,不会对内存存储进行改变等等

    (3) 只通过return返回输出的值,不会在其它地方打印

  2. 优势
    只需要关注函数内部的逻辑,更能提高专注开发

函数柯里化

  1. 定义: 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数
    // 原函数
      function foo( x,y,z ){
        return x+y+z
      }
    foo(1,2,3)
    
    // 柯里化函数
      function foo(x){
        return function(y){
          return function(z){
            return x+y+z
          }
        }
      }
    foo(1)(2)(3)
    
    // 箭头函数
    let foo = x=>y=>z=> x+y+z
    foo(1)(2)(3)
  2. 作用
    (1) 单一职责原则: 尽量让每个函数处理单一的业务逻辑,再将该函数的处理结果传递给下一个函数进行下一项任务逻辑的处理
    function foo(x){
      x*=2
      return function(y){
        y+=1
        return function(z){
          return x+y+z
        }
      }
    }
    foo(1)(2)(3) --> 8
    (2) 对某段代码逻辑复用
    function foo(x){
      x*=2
      return function(y){
        y+=1
        return function(z){
          return x+y+z
        }
      }
    }
    // 这里就对x*=2这段代码进行了复用
    let bar2 = foo(2)
    bar2(3)(4)
    bar2(5)(6)
  3. 柯里化函数的封装实现
    function hyCurrying(fn){
      return function curried(..args){
          // 判断收集的参数是否大于等于需要柯里化函数的参数总长度,如果大于等于则执行传递过来的函数
         if(args.length >= fn.length){
              // 如果大于,则直接调用fn函数,并将this执向一直绑定在curried函数内部,否则视为独立函数调用指向window
              return fn.apply(this,args)
          }else{
              // 如果没有达到所需参数的格式则递归调用检查是否达到所需参数长度,没有达到则拼接参数
              return function curried2(...args2){
                  return curried.apply(this,args.concat(args2))
              }
          }
      }
    }
    let  foo = hyCurrying(fn)
    foo(1)(2)(3)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!