函数柯里化的主要目的就是为了减少函数传参,同时将一些固定参数私有化。下面展示一段非常简单计算圆面积的代码来说明函数柯里化的原理:
//circle函数,接受半径r和π
function circle(r,p){
//计算半径为r的圆的面积
var area=p*r*r;
return area;
}
/*
* 通过函数柯里化来简化circle函数,只传入半径就能计算出面积
* 不管怎么样,π是不会变的,因此我们将他写死,不需要外部调用传入
*/
function curryCircle(r){
var p=3.14;
var area=p*r*r;
return area;
}
也许你会觉得这段代码很二,但是这就是函数柯里化的真实面目。当然上面的代码只是一个非常小的例子,真实世界中的函数柯里化会比它凶恶一点,下面来讨论一个更通用的例子。假设π不是唯一的(比如我们有三种π),我们计算圆面积公式当中的π会根据场景不同而变化,这个时候我们就不能直接写死,而需要根据不同环境来配置π:
//circle函数,接受半径r和π
function circle(r,p){
//计算半径为r的圆的面积
var area=p*r*r;
return area;
}
//针对circle函数的柯里化函数
function curry(fn,p){
var finalMethod=function(r){
var result=fn(r,p);
return result;
}
return finalMethod;
}
//我们有3种不同的π
var curryCircle1=curry(circle,1.14);
var curryCircle2=curry(circle,2.14);
var curryCircle3=curry(circle,3.14);
//输出:4.56 8.56 12.56
console.log(curryCircle1(2),curryCircle2(2),curryCircle3(2));
可以看到,curry方法通过封装最基础的circle方法,同时保存设置好的p参数(π),并返回一个finalMethod方法,这样我们最终调用finalMethod时就只需要传入参数r(半径)就可以完成。借助函数柯里化,我们拥有了三个简化的计算圆面积方法。