1. 程式人生 > >柯里化函式之Javascript

柯里化函式之Javascript

定義

根據定義來說,柯里化就是將一個接收“多個”引數的函式拆分成一個或者許多個接收“單一”引數的函式。定義看起來是比較抽象的,下面來舉個例子:

程式碼

12345 function concat(str1,str2){ return str1 + str2;}concat("forever","px") // "foreverpx"

不難理解,上面的程式碼中定義了一個連線字串的函式,返回連線兩個傳入引數的字串。現在我們再看看另一種定義方式:

12345678 function concatCurry(str1){ return function(str2){ return
str1 + str2; }}var concatOne = concatCurry("forever");concatOne("px"); //foreverpx

上面的程式碼中,我們將一開始傳入兩個引數的函式改裝成了一個(或者說是兩個)只接收一個引數的函式。

我們來建立一個將接受多個引數的函式柯里化的通用函式:

123456789 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),這樣就達到了柯里化的效果。

如果是三個引數的函式想要柯里化,則如下:

12345678 function concat(s1,s2,s3){ return s1+s2+s3;}var
cur1 = curry(concat,"forever");var cur2 = curry(cur1,"px");cur2("-me"); //foreverpx-me