函数柯里化

98 阅读1分钟

1、柯里化

柯里化(Currying)是一种处理函数中含有多个参数的方法,并在只允许单一参数的框架中使用这些函数。这种转变是现在被称为 “柯里化” 的过程,在这个过程中我们能把一个带有多个参数的函数转换成一系列的嵌套函数。它返回一个新函数,这个新函数期望传入下一个参数。当接收足够的参数后,会自动执行原函数。

const abc = function(a, b, c) {
  return [a, b, c];
};
 
const curried = _.curry(abc);
 
curried(1)(2)(3); // => [1, 2, 3]
curried(1, 2)(3); // => [1, 2, 3]
curried(1, 2, 3); // => [1, 2, 3]

1_.curry(func, [arity=func.length])

创建一个函数,该函数接收 func 的参数,要么调用func返回的结果,如果 func 所需参数已经提供,则直接返回 func 所执行的结果。或返回一个函数,接受余下的func 参数的函数,可以使用 func.length 设置需要累积的参数个数。

//uncrrying
function func(a){
    return function(b){
        return a * a + b * b
    }
}

console.log(func(3)(4)) // 25

//柯里化实现
//currying
 function _test(a,b,c){
     let result = Array.from(arguments).reduce((prev,next) => {
         return prev+ next;
     },0)
     return result
 }

 function _currying(func){
     return function _curry(...args){
         if(args.length >= func.length){
             //传入的参数大于等于func的形参数量 执行func
             return func.apply(this,args)
         }else {
             return function(..._args){
                return _curry.apply(this,args.concat(_args))
             }
         }
     }
 }

 console.log(_currying(_test)(1)(2,3))//6
 console.log(_currying(_test)(1,2)(3))//6
 console.log(_currying(_test)(1)(2)(3)) //6