定義
根據定義來說,柯里化就是將一個接收“多個”參數的函數拆分成一個或者許多個接收“單一”參數的函數。定義看起來是比較抽象的,下面來舉個例子:
代碼
1 2 3 4 5
|
function concat(str1,str2){ return str1 + str2; } concat("forever","px") // "foreverpx"
|
不難理解,上面的代碼中定義了一個連接字符串的函數,返回連接兩個傳入參數的字符串。現在我們再看看另一種定義方式:
1 2 3 4 5 6 7 8
|
function concatCurry(str1){ return function(str2){ return str1 + str2; } } var concatOne = concatCurry("forever"); concatOne("px"); //foreverpx
|
上面的代碼中,我們將一開始傳入兩個參數的函數改裝成了一個(或者說是兩個)只接收一個參數的函數。
我們來創建一個將接受多個參數的函數柯里化的通用函數:
1 2 3 4 5 6 7 8 9
|
function curry(fn) { var args = [].slice.call(arguments, 1); return function() { return fn.apply(null, args.concat([].slice.call(arguments, 0))); } } var concatOne = curry(concat,"forever"); concatOne("px"); //foreverpx
|
柯里化的過程利用了閉包,使得返回的函數也能獲得第一次傳入的參數。
首先將傳入的第二個參數存入args變量中,然後返回一個函數,在返回的函數中,將第一次傳入的參數與柯里化之後傳入的參數拼接起來成一個數組,然後通過apply方法調用柯里化之前的函數(fn),這樣就達到了柯里化的效果。
如果是三個參數的函數想要柯里化,則如下:
1 2 3 4 5 6 7 8
|
function concat(s1,s2,s3){ return s1+s2+s3; } var cur1 = curry(concat,"forever"); var cur2 = curry(cur1,"px"); cur2("-me"); //foreverpx-me
|
文章作者:foreverpx
文章原文鏈接:柯里化函數之Javascript