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