一、引出
接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
二、实现
function add(a,b,c,d){
return a + b + c + d;
};
function FixedParmasCurry(fn){
var _arg = [].slice.call(arguments,1);//0:fn,剪切后面的
return function(){//返回新函数
var newArg = _arg.concat([].slice.call(arguments,0));//将返回后的函数执行时参数拼接
return fn.apply(this,newArg);//最后执行的还是传进来的函数
};
};
var newadd = FixedParmasCurry(add,6);
console.log(newadd(7,8,9));
function Curry(fn,length){
var length = length || fn.length;
return function(){
if(arguments.length < length){
//[fn,a,..]
var conbined = [fn].concat([].slice.call(arguments,0));
//依次拼接参数
return Curry(FixedParmasCurry.apply(this,conbined),length - arguments.length);
}else{
return fn.apply(this,arguments);
}
}
};
var newadd = Curry(add);
console.log(newadd(3)(4)(5)(6));
三、习题练习
1.某面试题:
实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;
答案下期揭晓
博主开始运营自己的公众号啦,感兴趣的可以关注“飞羽逐星”微信公众号哦,拿起手机就能阅读感兴趣的博客啦!