
什么叫 currying?
在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家哈斯凯尔·加里命名的,尽管它是 Moses Schönfinkel 和 Gottlob Frege 发明的。 这是来自维基百科的名词解释。顾名思义,柯里化其实本身是固定一个可以预期的参数,并返回一个特定的函数,处理批特定的需求。这增加了函数的适用性,但同时也降低了函数的适用范围。
场景
例如现在我们需要编写一个计算器计算每个月的开销,我们都要记录今天花掉了多少钱。 或许我们会这样写:
1 2 3 4 5 6 7 8 9 10 11
| var monthCost =0; var cost =function(money){
monthCost +=money; }
cost(100); cost(200); cost(300); alert(monthCost);
|
使用 currying
使用 currying 后逻辑更简单 //例如现在我们需要编写一个计算器计算每个月的开销,我们都要记录今天花掉了多少钱。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| var cost=(function(){ args = [];
return function(){
if(arguments.length ===0){ var money = 0; args.forEach(function(m,i){ money+=m; }); return money; }else{ [].push.apply(args,arguments); } };
})();
cost(100); cost(200); cost(300); alert(cost());
|
编写通用的 currying 函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| var currying=function(fn){ var args = []; return function(){ if(arguments.length === 0){ console.log(fn);
return fn.apply(this,args);
}else{ [].push.apply(args,arguments); return arguments.callee; }
}; }; var cost=(function(){
var money = 0;
return function(){ for(var i=0;i<arguments.length;i++){ money+=arguments[i]; } return money; };
})();
//转换成currying函数 var cost = currying(cost);
cost(100); cost(200); cost(300); alert(cost());
|