zoukankan      html  css  js  c++  java
  • 柯里化函数(形参个数确定与形参个数不确定)

    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;

  • 相关阅读:
    2019计蒜之道初赛第三场题解
    牛客小白月赛14 :部分题目总结
    CF-558:部分题目总结
    浙江省第十六届大学生ACM程序设计竞赛部分题解
    浙江省高职院校联合训练(一)
    CF-544:部分题目总结
    CF-552E-Two Teams
    CF-551:部分题目总结
    freemarker使用map替换字符串中的值
    freemarker使用map替换ftl中相关值
  • 原文地址:https://www.cnblogs.com/xinyouhunran/p/14557522.html
Copyright © 2011-2022 走看看