console
function currying(fn,len){
//捕获函数需要传入 len 个函数后才可执行
//第一次调用获取函数 fn 参数的长度,后续调用获取 fn 剩余参数的长度
var len = len || fn.length;
return function(){
//判断新函数接收的参数长度是否大于等于 fn 剩余参数需要接收的长度
if( arguments.length >= len ){
//参数一致则执行函数
return fn.apply(this,arguments)
}else{
//不满足参数个数则递归 currying 函数传入 fn.bind() => 传入部分参数的新函数,并且重新定义新函数所需的参数个数
return currying(fn.bind(this,...arguments),len - arguments.length)
}
}
}
var test = currying(function(a,b,c){
return a + b + c;
});
console.log(test(1)()(2,3)); // 6
console.log(test()(1,2)(3)); // 6
console.log(test(1)(2)(3)); // 6
function sum(){
//将参数转化出数组
var args = [].slice.call(arguments);
function add(){
args.push(...arguments)
return add;
}
add.toString = function (){
if(!args.length){
return 0;
}
return args.reduce(function(a,b){
return a + b;
})
}
return add;
}
console.log(sum(1,2)(3) == 6) //true
console.log(sum(1,2)(3)(4) == 10) //true
console.log(sum(1)(2)(3)(4)(5) == 15) //true