柯里化函式之Javascript
阿新 • • 發佈:2019-02-19
定義
根據定義來說,柯里化就是將一個接收“多個”引數的函式拆分成一個或者許多個接收“單一”引數的函式。定義看起來是比較抽象的,下面來舉個例子:
程式碼
12345 | function concat(str1,str2){ return str1 + str2;}concat("forever","px") // "foreverpx" |
不難理解,上面的程式碼中定義了一個連線字串的函式,返回連線兩個傳入引數的字串。現在我們再看看另一種定義方式:
12345678 |
function concatCurry(str1){ return function(str2){ return |
上面的程式碼中,我們將一開始傳入兩個引數的函式改裝成了一個(或者說是兩個)只接收一個引數的函式。
我們來建立一個將接受多個引數的函式柯里化的通用函式:
123456789 |
function curry(fn) { var args = [].slice.call(arguments, 1); return function() { return fn.apply(null, args.concat([].slice.call(arguments |
柯里化的過程利用了閉包,使得返回的函式也能獲得第一次傳入的引數。
首先將傳入的第二個引數存入args變數中,然後返回一個函式,在返回的函式中,將第一次傳入的引數與柯里化之後傳入的引數拼接起來成一個數組,然後通過apply方法呼叫柯里化之前的函式(fn),這樣就達到了柯里化的效果。
如果是三個引數的函式想要柯里化,則如下:
12345678 |
function concat(s1,s2,s3){ return s1+s2+s3;}var |