函数柯里化就是创建已经设置单个参数或者多个参数的函数,函数变为接受一个参数,返回一个值,
1,实现
默认下为参数复用的情况
function curry(fn){
var curry=function(fn){
//这里是需要复用的参数
var args=Array.prototype.slice.call(arguments,1);
return function(){
//这里是自身参数
var innerArgs=Array.prototype.slice.call(arguments);
//合并自身参数和复用的参数
var finalArgs=args.concat(innerArgs);
return fn.apply(null,finalArgs);
}
}
}
2,应用
1,参数复用
var curry=function(fn){
//这里是需要复用的参数
var args=Array.prototype.slice.call(arguments,1);
return function(){
//这里是自身参数
var innerArgs=Array.prototype.slice.call(arguments);
//合并自身参数和复用的参数
var finalArgs=args.concat(innerArgs);
return fn.apply(null,finalArgs);
}
}
var add=function(){
var args=Array.prototype.slice.call(arguments);
var sum=0;
for(var i=0;i<args.length;i++){
sum+=args[i];
}
return sum;
}
var curryAdd=curry(add,3,4,5);
console.log(curryAdd(6,7)) //结果为25,也可以传入单个参数
2,延迟计算
创建已经设置单个参数或多个参数的函数的情况下,即在参数复用的情况,同时实现延迟计算
var add=function(){
var args=Array.prototype.slice.call(arguments);
var sum=0;
for(var i=0;i<args.length;i++){
sum+=args[i];
}
return sum;
}
var curryDelay=function(fn){
//复用的参数
var args=Array.prototype.slice.call(arguments,1);
//定义一个保存复用参数和自身参数的数组
var ary=args;
return function(){
//这里是自身参数
if(arguments.length==0){
return fn.apply(null,ary);
}else{
ary=ary.concat(Array.prototype.slice.call(arguments));
console.log(ary);
}
}
}
var curryDelayAdd=curryDelay(add,3,4,5);
curryDelayAdd(6); //ary为[3,4,5,6]
curryDelayAdd(7); //ary为[3,4,5,6,7]
curryDelayAdd(8); //ary为[3,4,5,6,7,8]
console.log(curryDelayAdd()); //结果33