什么叫 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());