理解柯里化

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); // 元旦价格

这里,我们通过柯里化的形式,省去了频繁传递的参数,这就是柯里化的作用, 可以更轻松的重用和配置。

总结

柯里化优点:

  • 更轻松的配置和重用代码;
  • 避免频繁的传递重复的参数。

你可能感兴趣的:(理解柯里化)