先看看JS中的柯里化是如何实现的:
定义一个函数
1 function sum(x,y,z){ 2 return x+y+z 3 }
手动实现柯里化方法:
1 function sum1(x){ 2 return function(y){ 3 return function(z){ 4 return x+y+z 5 } 6 } 7 }
或者
1 var sum2 = x=>y=>z=> x+y+z
可以发现手动实现柯里化后有两种结果一次性传入全部参数或者依次传入非固定的参数
那么就开始重写一下自己的柯里化函数吧(realize hycurring)
1 // realize hycurring 2 function hycurring(fn){ 3 return function curring(...args){ 4 if(args.length >= fn.length){ 5 return fn.call(this,...args) 6 }else{ 7 for(var i=0;i<(fn.length-args.length);i++){ 8 function curring1(...arges2){ 9 return curring.call(this,...args.concat(...arges2)) 10 } 11 return curring1 12 } 13 14 } 15 16 } 17 18 }
或者
1 function sum(x,y,z){ 2 return x+y+z 3 } 4 // console.log(sum(1,2,3)); 5 6 function hycurring(fn){ 7 return function curring(...ags){ 8 if(ags.length >=fn.length){ 9 return fn.apply(this,ags) 10 }else{ 11 function curring2(...ags2){ 12 return curring.apply(this,ags.concat(ags2)) 13 } 14 return curring2 15 } 16 } 17 18 } 19 var sum=hycurring(sum); 20 var sum2=sum(1)(2)(3) 21 console.log(sum2);