一.柯里化
在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家哈斯凯尔·加里命名的,尽管它是 Moses Sch?nfinkel 和 戈特洛布·弗雷格 发明的。
在直觉上,柯里化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”。所以对于有两个变量的函数,如果固定了 ,则得到有一个变量的函数 。
在理论计算机科学中,柯里化提供了在简单的理论模型中,比如:只接受一个单一参数的lambda 演算中,研究带有多个参数的函数的方式。
函数柯里化的对偶是Uncurrying,一种使用匿名单参数函数来实现多参数函数的方法。
实例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>函数curry化</title>
</head>
<body>
<div>函数curry化</div>
<script type="text/javascript">
var foo = function(a) {
return function(b) {
return a * a + b * b;
}
}
alert((foo(3))(4));
alert(foo(3)(4));
</script>
</body>
</html>
运行结果:
二.javascript 函数curry化
当发现正在调用同一个函数,并且传递的参数绝大多数是相同的,那么该函数可能是用于curry化的一个很好的候选参数,可以通过将函数集合部分应用到函数中,从而动态创建一个新函数,这个新函数将会保存重复的参数,并且还会使用预填充原始函数所期望的完整列表。
curry化就是用闭包原理实现函数参数的合并,然后再运行函数。
实例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>函数curry化</title>
</head>
<body>
<div>函数curry化</div>
<script type="text/javascript">
function curry(fn){
var slice=Array.prototype.slice,
stored_args=slice.call(arguments,1);
alert("stored_args:"+stored_args);
return function(){
var new_args=slice.call(arguments),
args=stored_args.concat(new_args);
alert("new_args:"+new_args);
alert("args:"+args);
return fn.apply(null,args);
}
}
function add(a,b,c){
return a+b+c;
}
alert(curry(add,1)(2,3));
</script>
</body>
</html>
运行结果:
相继弹出如下结果信息