函数柯理化

近期在看函数柯理化的一些视频,自己记一下以防忘记

递归实现柯理化

//想要在调用curry的时候能在我传递够参数之后给我返回结果如果未传递完毕参数则继续返回一个function

function curry(fn,len){
    var len = len||fn.length;//第一次进来因为没有传len所以他会来取这个fn.length这个取出来的就是fn的参数列表

    var func = function(fn){//首先定义一个函数用来拿到之前传进来的参数
    var _arg = [].slice.call(arguments,1);//[].slice.call可以吧arguments类数组对象转为数组,截取掉第一个是把fn给截取出来剩下的就是参数列表
    return function(){//返回出去一个函数以确保每次能够接受新的参数而不是执行fn
        var newArgs = _arg.concat([].slice.call(arguments));//再这里拿到之前所拿到的参数和新得到的参数
        return fn.apply(this,newArgs);//调用fn方法,使用apply是为了能把参数列表展开
    }
  }
 return function(){//调用函数最终会return出去一个function 会在这个函数内进行判断参数列表是否有传递完毕
      var argLen = arguments.length;
      if(argLen<len){//没有传递完毕就继续调用curry来递归传递
          var formatedArr = [fn].concat([].slice.call(arguments));
          return curry(func.apply(this,formatedArr),len - argLen)
      }else{//出口
          return fn.apply(this,arguments)
      }
  }
}
function add(a,b,c,d){
    return a+b+c+d
}


var add2 = curry(add)
var res = add2(4)(2)(2)(1)
var res = add2(1,2)(3,4)
var res = add2(1)(2,3,4)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值