<!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:群友(雕兄)的延伸拓展
柯里化的渊源应该是λ演算演算
λ演算演算里面只有一中数据类型,函数,这个函数只接受一个参数,也只返回一个参数
并且这个参数还是单值函数
效果图: