柯裡化是把接受多個參數的函數變換成接受一個單一參數的函數,並且返回一個新函數,這個新函數能夠接受原函數的參數。下面可以通過例子來幫助理解。
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,表示被返回的數組的第一個元素應該是第二個參數。