javascript 函数curry化

一.柯里化

        在计算机科学中,柯里化(英语: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化
 

二.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>

运行结果:

相继弹出如下结果信息
javascript 函数curry化
javascript 函数curry化
javascript 函数curry化
javascript 函数curry化