建議67:套用函數
套用是JavaScript函數一個很有趣的應用。所謂套用就是将函數與傳遞給它的參數相結合,産生一個新的函數。在函數式程式設計中,函數本身也是一個值,這種特性允許使用者以有趣的方式去操作函數值。例如,在下面代碼中定義一個add()函數,該函數能夠傳回一個新的函數,并把參數值傳遞給這個新函數,進而實作連加操作。
var add = function(n){
}
document.writeln(add(2)(3)); //5
當然,也可以為JavaScript擴充一個curry方法,實作函數的套用應用。
Function.prototype.method = function(name, func) {
};
Function.method('curry', function() {
});
curry方法通過建立一個儲存原始函數和被套用函數的參數的閉包來工作。該方法傳回另一個函數,該函數被調用時會傳回調用原始函數的結果,并傳遞調用curry時的參數加上目前調用的參數的所有參數。curry使用Array的concat方法連接配接兩個參數數組。但由于arguments數組并非一個真正的數組,是以它并沒有concat方法,要避開這個問題,必須在兩個arguments數組上都應用數組的slice方法,這樣才會産生出擁有concat方法的正常數組。
下面就來應用curry方法,通過curry方法調用add函數,會傳回一個新的函數add1,在這個新的傳回函數中儲存了調用add函數時傳遞的值,當調用add1函數時,将新舊函數的參數進行相加,傳回7。
var add = function() {
var add1 = add.curry(2);
document.writeln(add1(3)); // 7