什么是函数柯里化?
概念:函数柯里化就是把一个具有n个参数的函数转变成为可以进行二次甚至n次调用执行的函数,也就是说将函数的n个参数分1~n次传入,在n个参数传入完成后一次性执行这个函数。
原理:函数柯里化的原理就是将要柯里化的函数作为柯里化标准函数的返回值,将要保存的内容作为外部函数的变量。也就是利用闭包创建一个私有域,使内部变量可以长期保存在内存中,直到内部返回的函数执行完成。(也就是要被柯里化的函数的n个参数都传入完成,一次性完成了计算操作,那么闭包中保存的变量就被释放)
以一个简单的例子来说:比如我们要计算一个人他三天的总花费,他会每天记录一下自己当天的花费,然后在第三天得出自己这三天来的总花费。那么这三天的每一天他都会调用一次这个函数,最后在第三天一次性计算出总花费。
简单的函数柯里化实现(可以多次调用版):
如上述例子中需要柯里化的函数如下:
let add=function(a,b,c){
return a+b+c;
}
实现柯里化的函数:
// 可以多次执行的函数柯里化
let curry=function(fun){
let args=Array.prototype.slice.call(arguments,1);//取出除了函数外的其它参数保存在args中
return function(){
let newArgs=args.concat(Array.from(arguments));//后面每次调用都把参数拼接到args中保存
if(newArgs.length<fun.length){//函数参数还没有完全传完
return curry.call(this,fun,...newArgs);//重新进行柯里化,实现多次调用
}else{//如果参数全部传完
return fun.apply(this,newArgs);//返回全部参数一次性执行函数的结果
}
}
}
执行示例如下:
let f1=curry(add,1);
console.log(f1(1)(2));//多次调用,结果为4
console.log(f1(2,3));//二次调用,结果为6