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


    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;

  • 相关阅读:
    递归的小实例
    try-catch-finally实例
    集合的排序(正序,倒序,从大到小排序)
    数组的排序(sort和冒泡)
    拦截器的使用,不登录用户不能进行其他操作
    把日志从数据库导出到Excel表格中(poi)
    Java 对Excel进行导入操作
    java 面试题集锦
    端口被占用解决办法
    (转)Java 最常见的 200+ 面试题汇总
  • 原文地址:https://www.cnblogs.com/xinyouhunran/p/14557522.html
Copyright © 2020-2023  润新知