柯里化函数

柯里化:

柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

核心思想是把多参数传入的函数拆成单参数(或部分)函数,内部再返回调用下一个单参数(或部分)函数,依次处理剩余的参数。

带有参数的柯里化函数

function Curry(fn){
    //fn函数 需要传参数的长度  
    let len = fn.length;
    //获取到函数实参的值  
    let fnArr = [].slice.call(arguments,1);     
    
    return function curryed(...args){
       //拼接所有参数
         let newArgs = [...fnArr,...args];    
         //所传参数是否齐全     
         if(newArgs.length >= len){
             fn.apply(this,newArgs)
         }else{
             return function(...arg){
                 return curryed.apply(this,[...arg,...args])
              }
          }
   }
}     


function add(a,b,c,d){
   console.log(a+b+c+d)  
}

var addCurry = new Curry(add,1)
addCurry(2,3,4)  //10
addCurry(2)(3)(4)  //10



//另一种利用toString隐式特性
function Curry(){
  let args = [...arguments]
  function fn(){
    args.push(...arguments)
    return fn
  }
 fn.toString = function (){
    return args.reduce((a,b) =>a + b)
  }
return fn
}

不带参数的柯里化函数

function Curry(fn){
   // 获取到参数值
   let fnArr = [].slice.call(arguments,1);
  
   return function curryed(...args){
       //没有传参数
       if(!args.length){
            return fn.apply(this,[...args,...fnArr])
         }
       return function(...arg){
           if(!arg.length){
                  return fn.apply(this,[...arg,...fnArr,...args])
              }
           return curryed.apply(this,[...arg,...args])
         }
    }  
}    


function add(){
 var args = Array.from(arguments);
 return args.reduce((a,b) => a+b) 
}

var  curryAdd = new Curry(add,1,2,3,4)
console.log(curryAdd())   // 10
console.log(curryAdd(5))  //15

 

 

posted @ 2020-05-07 14:54  心之所指,行之所至  阅读(366)  评论(0)    收藏  举报