JS 柯里化(Currying)

<!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:羣友(雕兄)的延伸拓展

柯里化的淵源應該是λ演算演算
λ演算演算裏面只有一中數據類型,函數,這個函數只接受一個參數,也只返回一個參數
並且這個參數還是單值函數

 

效果圖:

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章