JavaScript函数柯里化,我们直接来看一段普通的代码:
function (a, b, c) {
return a * b * c;
}
上面这个函数很简答, 就是对传入的a、b、c
参数进行了计算,现在我们改成柯里化的形式:
// 柯里化的形式
function curry(a) {
return (a) => {
return (b) => {
return a * b * c;
}
}
}
你会发现,将普通函数改成柯里化的形式无非就是嵌套返回多个函数,我们在调用的时候,只需要这样调用:
// 调用柯里化函数
const num1 = curry(1)(2)(3); // 6
// 或者
const num2 = curry(1);
const num2_total = num2(2)(3); // 6
调用也很简单,无非就是将返回返回的函数在执行一下。
这里由于闭包的原因,返回的函数仍然可以拿到(引用)上一个传递的参数。
柯里化的应用场景
任何一段代码,如果没有应用场景,将毫无价值。
这里,前面虽然我们简单的理解了柯里化,但是有哪些场景呢?为什么需要把原本很简单的函数题包装成嵌套多层的函数?
我们考虑下这样的场景:
我们在淘宝上售卖一件商品,原价200元,在十月一号国庆节这一天,我们需要促销打8折售卖,而在双十一这一天,我们需要打5折售卖,此时,我们就需要计算打折后的售卖价格。
这里,我们先来看普通的编写方式:
// 封装一个计算函数
function countPrice(price, discount) {
return price * discount;
}
const price1 = countPrice(200, 0.8); // 国庆节促销价格
const price2 = countPrice(200, .05); //双十一促销价格
上面代码很容易理解,我们定义了一个接受两个参数(arity)
的函数,分别来计算国庆节和双十一的促销价格。
没毛病吗?
上面代码没毛病,但是仔细一想,price
参数没必要每次都传啊,如果我们每个月甚至每天都有打折促销,岂不是要写很多,要传递很多price
参数。
如果我们改成柯里化的形式:
// 柯里化的形式
function countPrice(price) {
return (discount) => {
return price * discount;
}
}
const price = countPrice(200);
const price_total1 = price(0.8); // 国庆节价格
const price_total2 = price(0.5); // 双十一价格
const price_total3 = price(0.7); // 双十二价格
const price_total2 = price(0.8); // 元旦价格
这里,我们通过柯里化的形式,省去了频繁传递的参数,这就是柯里化的作用, 可以更轻松的重用和配置。
总结
柯里化优点:
- 更轻松的配置和重用代码;
- 避免频繁的传递重复的参数。