函数柯里化

柯里化

柯里化(curring)的概念最早由俄国数学家Moses_Schönfinkel发明,而后由著名的数理逻辑学家Haskell将其丰富和发展,curring由此得名

curring又称部分求值.一个curring的函数首先会接受一些参数,接受了这些参数之后,该函数不会立即求值,而是继续返回另一个函数,刚才传入的参数在函数形成的闭包中被保存起来.待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值

例子:

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
var curring=function(){
var args=[];
return function(){
if(arguments.length === 0){
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,l=arguments.length;i<l;i++){
money+=arguments[i];
}
return money;
}
})()
var cost=curring(cost);
cost(100); //未被真正求值
cost(200); //未被真正求值
cost(300); //未被真正求值
alert(cost()); //求值并输出:600

还有一种写法是:

1
2
3
4
5
6
7
8
9
10
11
12
13
function curry(fn){
var args=Array.prototype.slice.call(arguments,1); //剔除第一个参数即fn
return function(){
var innerArgs=Array.prototype.slice.call(arguments);//将对象转成数组
var finalArgs=args.concat(innerArgs);//合并参数
return fn.apply(this,finalArgs);
}
}
function add(num1,num2,num3){
return num1+num2+num3;
}
var total=curry(add,50)(30,40);
console.log(total) //120

这种柯里化的思想就是合并参数