<!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:羣友(雕兄)的延伸拓展
柯里化的淵源應該是λ演算演算
λ演算演算裏面只有一中數據類型,函數,這個函數只接受一個參數,也只返回一個參數
並且這個參數還是單值函數
效果圖: