函数柯里化

柯里化函数概念就是将一个多参数的函数 转化为单一参数的函数;

举个栗子

function add(a,b,c){

  return a + b + c;

}

 

现在需要让这个函数能够实现这么调用 add(1)(2)(3)或者add(1,2)(3) 或者add(1,2,3)

使用curry函数对这个函数进行柯里化

function curry(func){
    let argLength = func.length; // 获取函数参数的个数
  let curried = (...args) => {
          // 需要把参数凑齐了 才能执行传入的func函数 ,最终要返回  func(...args)
          // 所以当参数不够的时候继续执行柯里化,收集参数 
         if(args.length < argLength) {
           // 收集参数
            return (...rest) => curried(...args, ...rest)
         }else {
             // 参数齐了 执行func
              return func(...args)
        }
   }
  // 返回这个函数
  return curried
}


  

测试: 

let add2 = curry(add)
console.log(add2(1, 2)(3))  // 6
console.log(add2(1)(2)(3))  // 6

  

 

然后我们看到很多地方有箭头函数连续写的

 

例如let func = a => b => c => {return a+b+c}

其实就是一个柯里化的过程,是属于es6的多次柯里化过程

let func2 = a => (b,c) => (de) => { return a + b +c +de}
调用

func(1)(2)(3)

func2(1)(2,3)(4)

但是我们可以将前两次传参存给一个变量, 这样 最后一次我们再传参再决定求值

例如  

let add3 = func(3)

let add4 = add3(1)

现在我们重新定义了两个函数,任何数和add3或者add4相加

add3(3) // 6

add4(4) // 8

所以我们得出以下结论

柯里化函数的功能

  1. 可以惰性求值
  2. 可以提前传递部分参数

 

posted @ 2022-04-14 17:28  大桥默默学  阅读(71)  评论(0编辑  收藏  举报