柯里化就是分批接受参数,不会立刻求值,而是到了需要的时候才去求值。主要用于数据量非常大的情况。
在形式上,柯里化就是把接收多个参数的函数变为接收单一参数的函数(需要柯里化的函数的第一个参数),并且返回一个接收剩下的参数并返回结果的新函数。
本质上,柯里化利用的是闭包。
例如一个加法函数:
function add(x,y){
return x + y;
}
add(3,4);//5
将它柯里化后就变为:
var add = function(x){
return function(y){
return x + y;
}
};
add(3)(4);
柯里化能够延迟计算、参数复用、动态生成函数。
原生JS实现:
function curry(fn){
var args=array.prototype.slice.call(arguments,1);
return function(){
var innerArgs=Array.prototype.slice.call(arguments);
var finalArgs=args.cancat(innerArgs);
return fn.apply(null,finalArgs);
};
}
Curry()的第一个参数是要进行柯里化的函数,其他参数是要传入的值。为了获取第一个参数之后的所有参数,在arguments对象上调用了slice()方法,并传入参数1。Args数组包含了外部函数的参数,innerArgs包含了内部函数的参数,然后用cancat()组合为finalArgs。最后用apply把结果传递给该函数。