近期在看函数柯理化的一些视频,自己记一下以防忘记 递归实现柯理化 //想要在调用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)