柯里化函数(形参个数确定与形参个数不确定)

1.当函数形参个数确定的时候:
function sum(a,b,c){
  console.log(a+b+c);
}
实现sum(1,2,3)==sum(1)(2)(3);
function curry(fn) {
  return function curryFn(...args) {
    if (args.length < fn.length) {
      //args.length:当前执行函数传入的实参的个数;
      //fn.length:函数sum形参确定,fn.length的值为形参的个数;此处为3
      //只要满足条件,递归返回函数
      return function(...argss) {
        //这里的argss是返回函数时的参数
        return curryFn(...args.concat(argss));
      }
    }
    return fn(...args);
  }
}
var mySum = curry(sum);
mySum(1,2,3):
实参为(1,2,3),即实参个数为3==sum函数的形参个数3;不进入条件,直接执行sum(1,2,3);
mySum(1)(2)(3):
第一次实参为1,实参个数1<sum函数的形参个数3,进入条件,curryFn(1,2);
第二次实参为1,2,实参个数2<sum函数的形参个数3,进入条件,curryFn(1,2,3);
第三次实参为1,2,3,实参个数3==sum函数的形参个数3,不进入条件,执行sum(1,2,3);

2.当函数形参个数不确定的时候
计算以下结果
sumAdd(1,2,3)
sumAdd(1)(2,3)(4)
sumAdd(1,2)(3)(4)(5)
由于参数不确定,就要一直返回函数,返回函数内部定义了一个函数对象(我管这叫函数对象),
将每次函数执行获取的参数保存到函数对象中并返回函数对象,然后给函数对象扩展一个计算结果的方法即可。
function sumAdd(...args){
  function currySum(){
    //定义函数对象
    function mySum(...argss){
    //这一步即是将每次函数执行的参数保存下来
      args = args.concat(argss);
      return mySum;
    }
    mySum.getResult = function(){
      //这一步即是将保存的参数进行结果计算
      return args.reduce((a,b)=>{
        return a+b;
      })
    }
    return mySum;//最终返回的函数对象
  }
  return currySum();//返回函数
}
形似sumAdd(1)(2,3)(4)这种得到的结果都是mySum函数对象,要得到计算结果还得调用getResult();
有几对括号就返回函数几次。
console.log(sumAdd(1,2,3).getResult());
返回函数一次,然后调用getResult;
console.log(sumAdd(1)(2,3)(4).getResult());
返回函数三次,然后调用getResult;
console.log(sumAdd(1,2)(3)(4)(5).getResult());
返回函数四次,然后调用getResult;

 

posted @ 2021-03-25 16:59  你风致  阅读(242)  评论(0)    收藏  举报