首页 > 编程笔记

JS函数柯里化的理解

JavaScript 柯里化(Currying)是指把一个接收多个参数的函数转化为一系列接收一个参数的子函数的过程。

例如,通过汇率计算1美元能兑换多少人民币,可以定义一个函数,接收美元数量和汇率为参数,并返回换算后的结果,使用普通函数实现的代码如下:
function usdToCny(amount,rate){
     return amount*rate;
}
console.log(usdToCny(1,6.78));   //6.78
console.log(usdToCny(8,6.78));   //54.24
通过观察上例中的代码可以发现,汇率需要在每次调用的时候都传一次,那么除了可以给 rate 设置默认值外,也可以通过柯里化的形式,实现记住汇率值,代码如下:
function convertRate(rate){
     return(amount)=>amount*rate;
}
//普通调用
//console.log(convertRate(6.78)(10));//67.8
//记录中间值
const uToC=convertRate(6.78);
console.log(uToC(1));  //6.78
console.log(uToC(8));  //54.24
调用柯里化后的函数时,变成了使用连续的小括号的形式,这样任意一步的调用结果都可以保存起来,然后进行复用。

例如把汇率 6.78 保存到 uToC() 函数中,之后只需给 uToC() 函数传递美元数量,就可以计算出能够兑换的人民币的数量了。

再看更复杂一点的例子,假设把美元换算成日元,并且需要把人民币作为中间货币,那么可以再定义一个 cToJ() 函数用于把人民币换算成日元,之后再定义一个 uToJ() 函数用于把美元换算成日元,它里边会组合 uToC() 和 cToJ() 函数,先调用 uToC() 把美元换算成人民币,然后把结果作为 cToJ() 的参数将人民币换算成日元,代码如下:
const cToJ=convertRate(15.74);
const uToJ=(amount)=>cToJ(uToC(amount));
console.log(uToJ(1));  //106.7172
可以看到组合函数之后,最终只需传递一个美元数量便可以计算以人民币为中间货币所能够兑换的日元的数量了。

推荐阅读