函数Kelihua有时会遇到类似这样的需求add(5)(2)(3)=10add(2,5)(3)=10add(1)(7,2)=10add(1)(8)(1)()=10add(7,1)(1)(1)()=10add(4)(2,1)(1)(2)()=10柯丽华的两种写法1.传记参数个数entered满足函数执行的参数个数,即functioncurry_(fn){//返回一个新的函数judge,接收到的参数为...argsreturnfunctionjudge(...arg){if(arg.length>=fn.length){//新函数接收的参数长度是否满足函数执行需要的长度returnfn(...arg)//满足要求,执行fn函数,通过intheparametersofthenewfunction}else{//如果不满足要求,递归判断函数在下次执行时对传入的参数进行整合returnfunction(...args){returnjudge(...args,...arg)}}}}varcurry_fn=curry_(function(a,b,c){returna+b+c});console.log(curry_fn(5)(2)(3),'limitedparametercurry');//10es6简化:constcurry_=fn=>judge=(...args)=>args.length===fn.length?fn(...args):(...arg)=>judge(...args,...arg)2.传入的最后一个参数值为空,即函数curry_(fn){returnfunctionjudge(...arg){//返回一个新函数,此时arg为[23,1]],即curry_fn传入的第一个参数returnfunction(...args){//每次执行前一个函数后返回函数,即curry_fn(23,1)执行后的函数,argsis3,4,0if(!args.length){//如果后面的函数没有参数(),则开始执行函数returnfn(...arg)}else{//如果参数为后一个函数存在,则递归,存入argreturnjudge(...args,...arg);}}}}varcurry_fn=curry_(function(...args){returnargs.reduce((a,b)=>a+b,0)});console.log(curry_fn(2,1)(3)(4)(),'有限参数Curry');//10es6简化:constadder_=fn=>judge=(...arg)=>(...args)=>!args.length?fn(...arg):judge(...arg,...args)组成函数1,从右往左执行2,上一个函数的执行结果作为下一个函数3的参数。第一个函数有多个参数,后面的函数都有一个参数4.所有函数的执行是同步的letgreeting=(...arg)=>'hello,'+arg.join('')//第一个函数(多个参数)lettoUpper=str=>str.toUpperCase()//第二个函数lettiming=str=>`${str}time=${+newDate()}`//第三个函数//方法一、reduce方法letcompose=function(...func){//如果没有函数,则返回compose_my参数中的第一个函数if(func.length==0){returnfunction(arg){returnarg}}//如果只有一个函数,则返回这个函数if(func.length==1){returnfunc[0]}//返回reduce处理的结果returnfunc.reduce((itemFn,callback)=>{//初始回调是第一个函数,即greeting()returnfunction(...arg){//arg是最终返回的结果通过accept处理函数函数的参数为??'jack','smith','wang'returnitemFn(callback(...arg))//第一个函数接受多个参数,返回一个值作为aparameterbynextfunction,最后输出}})}//es6version:letcompose=(...funcs)=>{if(funcs.length===0)returnarg=>argif(funcs.length===1)returnfuncs[0]returnfuncs.reduce((a,b)=>(...args)=>a(b(...args)))}//方法2,slider递归让compose=(...args)=>{varlen=args.length//记录我们传入的所有函数的个数varcount=len-1//游标记录函数的执行,同时也作为我们正在运行的函数的索引varresult//结果,每次函数执行完成后,向下传递returnfunctionf1(...arg){//arg是接受返回的最终函数的参数处理函数,即'jack','smith','wang'result=args[count](...arg)if(count<=0){//当只有一个函数时,count=len-1returnresult}else{//当有多个函数时,光标移动并递归执行count--returnf1(result)}}}letfn=compose(timing,toUpper,greeting)console.日志(fn('杰克','史密斯','王'))
