科里化:这是函数闭包的一种特殊形式,建立一个函数的生成器.它接受函数的名字和参数,而且返回一个新的局部函数,它只须要剩余的参数.api
举个例子:数组
//科里化函数
function curry(fn,scope){
var scope = scope || window;
var args = [];
for(var i = 2,len = arguments.length;i<len;++i){
args.push(arguments[i]);
}
return function(){
var args2 = [];
for(var i=0;i<arguments.length;i++){
args2.push(arguments[i]);
}
var argsTotal = args.concat(args2);
return fn.apply(scope,argsTotal);
}
}
//下面咱们来计算两家基金1个月的利息金额
//rateA 表明 A基金的日利率
//rateB 表明 B基金的日利率
//days 表明 天数
//capital 表明 本金
function interest(rateA,rateB,days,capital){
//咱们将返回一个数组
//位置[0]表明A基金N天的盈利
//位置[1]表明B基金N天的盈利
return [rateA*days*capital,rateB*days*capital];
}
//假设咱们有5名顾客的资金须要计算
//假设A的日利率为0.01,B为0.02
//传统方式:
interest(0.01,0.02,30,2000);
interest(0.01,0.02,40,3000);
interest(0.01,0.02,50,4000);
interest(0.01,0.02,30,5000);
interest(0.01,0.02,50,6000);
//0.01,0.02一直在重复,削弱了应用的性能
//使用科里化方式:
var interestCurry = curry(interest,null,0.01,0.02);
interestCurry(30,2000);
interestCurry(40,3000);
interestCurry(50,4000);
interestCurry(30,5000);
interestCurry(50,6000);//科里化方式给函数附加了一些参数,避免了大量的重复,curry也能够接受做用域做为参数,但本例没有特定的做用域所以使用window对象.//不少框架都提供了curry方法,例如Dojo,jQuery,Prototype.js等.