<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>JS 柯里化(Currying)</title>
</head>
<body>
<script type="text/javascript">
//f(x)和g(x)合成为f(g(x)),有一个隐藏的前提,就是f和g都只能接受一个参数。
//如果可以接受多个参数,比如f(x, y)和g(a, b, c),函数合成就非常麻烦。
//这时就需要函数柯里化了。所谓"柯里化",就是把一个多参数的函数,转化为单参数函数。

//群友(小硕)的解释
//柯里化是把一个有n个参数的函数变成n个只有1个参数的函数
//群友(Cloud)的解释
//柯里化一般都用到了闭包的,因为要访问上一次调用后返回在上一层函数中的变量
//群友(雕兄)的解释
//柯里化是把多参数函数变成一次只接受一个参数的函数

//柯里化之前
function add(x,y){
	return x+y;
}
console.info('柯里化之前:'+add(4,5));

//柯里化之后 , 这个也算 柯里化+闭包
function add2(x){
	return function(y){
		return x+y;
	};
}
console.info('柯里化之后:'+add2(4)(5));

//更深一些的柯里化,这个也算 柯里化+闭包
function add3(x){
    var sum = x;
    var tmp = function(y){
        sum = sum + y;
        return tmp;
    };
    tmp.toString = function(){
        return sum;
    };
    return tmp;
}
console.info('更深一些的柯里化:'+add3(4)(5)(6)(7)(8)(9));

//等于add3 = add3f
function add3f(x){
	return function(y){
		return function(z){
			return function(a){
				return function(b){
					return function(c){
						return x+y+z+a+b+c;
					};
				};
			};
		};
	};
}
console.info('add3 = add3f:'+add3f(4)(5)(6)(7)(8)(9));

//函数声明和函数表达式(fe)
//函数声明:function fn(){}; 
//函数表达式:var aaa = function fn(){}; var aaa = function(){};
//下面说说 匿名函数赋值给一个变量
//函数表达式的柯里化,这个也算 柯里化+闭包
var add4 = function(x){
	var sum = x;
    var tmp = function(y){
        sum = sum + y;
        return tmp;
    };
    tmp.toString = function(){
        return sum;
    };
    return tmp;
}
console.info('函数表达式的柯里化:'+add4(4)(5)(6)(7)(8));
</script>	
</body>
</html>



 

PS:群友(雕兄)的延伸拓展

柯里化的渊源应该是λ演算演算
λ演算演算里面只有一中数据类型,函数,这个函数只接受一个参数,也只返回一个参数
并且这个参数还是单值函数

 

效果图:

JS 柯里化(Currying)_函数表达式