讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議67:套用函數 >

建議67:套用函數

套用是JavaScript函數一個很有趣的應用。所謂套用就是將函數與傳遞給它的參數相結合,產生一個新的函數。在函數式編程中,函數本身也是一個值,這種特性允許用戶以有趣的方式去操作函數值。例如,在下面代碼中定義一個add函數,該函數能夠返回一個新的函數,並把參數值傳遞給這個新函數,從而實現連加操作。


var add=function(n){

return function(m){

return n+m;

}

}

document.writeln(add(2)(3));//5


當然,也可以為JavaScript擴展一個curry方法,實現函數的套用應用。


Function.prototype.method=function(name,func){

if(!this.prototype[name]){

this.prototype[name]=func;

return this;

}

};

Function.method('curry',function{

var slice=Array.prototype.slice;

var args=slice.apply(arguments),that=this;

return function{

return that.apply(null,args.concat(slice.apply(arguments)));

};

});


curry方法通過創建一個保存原始函數和被套用函數的參數的閉包來工作。該方法返回另一個函數,該函數被調用時會返回調用原始函數的結果,並傳遞調用curry時的參數加上當前調用的參數的所有參數。curry使用Array的concat方法連接兩個參數數組。但由於arguments數組並非一個真正的數組,所以它並沒有concat方法,要避開這個問題,必須在兩個arguments數組上都應用數組的slice方法,這樣才會產生出擁有concat方法的常規數組。

下面就來應用curry方法,通過curry方法調用add函數,會返回一個新的函數add1,在這個新的返回函數中保存了調用add函數時傳遞的值,當調用add1函數時,將新舊函數的參數進行相加,返回7。


var add=function{

var i,sum=0;

for(i=0;i<arguments.length;i+=1){

sum+=arguments[i];

}

return sum;

};

var add1=add.curry(2);

document.writeln(add1(3));//7