柯里化函式之Javascript

foreverpx發表於2014-09-30

柯里化函式之Javascript

定義

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

程式碼

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

相關文章