讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議75:函數柯裡化 >

建議75:函數柯裡化

柯裡化是把接受多個參數的函數變換成接受一個單一參數的函數,並且返回一個新函數,這個新函數能夠接受原函數的參數。下面可以通過例子來幫助理解。


function adder(num){

return function(x){

return num+x;

}

}

var add5=adder(5);

var add6=adder(6);

print(add5(1));//6

print(add6(1));//7


函數adder接受一個參數,並返回一個函數,這個返回的函數可以像預期那樣被調用。變量add5保存著adder(5)返回的函數,這個函數可以接受一個參數,並返回參數與5的和。柯裡化在DOM的回調中非常有用。

函數柯裡化的主要功能是提供了強大的動態函數創建方法,通過調用另一個函數並為它傳入要柯裡化(currying)的函數和必要的參數而得到。通俗點說就是利用已有的函數,再創建一個動態的函數,該動態函數內部還是通過已有的函數來發生作用,只是傳入更多的參數來簡化函數的參數方面的調用。


function curry(fn){

var args=.slice.call(arguments,1);

return function{

return fn.apply(null,args.concat(.slice.call(arguments,0)));

}

}

function add(num1,num2){

return num1+num2;

}

var newAdd=curry(add,5);

alert(newAdd(6));//11


在curry函數的內部,私有變量args相當於一個存儲器,用來暫時存儲在調用curry函數時所傳遞的參數值,這樣再跟後面動態創建函數調用時的參數合併並執行,就會得到一樣的效果。

函數柯裡化的基本方法和函數綁定是一樣的:使用一個閉包返回一個函數。兩者的區別在於,當函數被調用時,返回函數還需要設置一些傳入的參數。


function bind(fn,context){

var args=Array.prototype.slice.call(arguments,2);

return function{

var innerArgs=Array.prototype.slice.call(arguments);

var finalArgs=args.concat(innerArgs);

return fn.apply(context,finalArgs);

};

}


創建柯裡化函數的通用方式是:


function curry(fn){

var args=Array.prototype.slice.call(arguments,1);

return function{

var innerArgs=Array.prototype.slice.call(arguments);

var finalArgs=args.concat(innerArgs);retrun

fn.apply(null,finalArgs);

};

}


curry函數的主要功能就是將被返回的函數的參數進行排序。為了獲取第一個參數後的所有參數,在arguments對像上調用slice方法,並傳入參數1,表示被返回的數組的第一個元素應該是第二個參數。