柯里化函數之Javascript

柯里化函數之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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章