继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

详解JavaScript柯里化:一个真实的项目应用案例

忽然笑
关注TA
已关注
手记 352
粉丝 64
获赞 277

你是否在 JavaScript 中见过“柯里化”这个词,并好奇它是什么意思?在这篇文章里,我们一起来看看什么是柯里化,通过一些简单的例子来解释,并展示如何在实际项目中使用它,让你的代码更清晰、更灵活。

💡 啥是柯里化函数?

柯里化 是一种函数式编程方法,其中函数一次处理一个参数,而不是一次性使用所有参数。柯里化函数每次返回另一个函数,直到所有参数都被提供为止。
简单来说,柯里化将一个多参数函数转换为一系列单参数函数,这使得每个函数可以逐步处理输入。

让我们用现实生活中的例子和代码来理解:

🍔 做一份汉堡

想象一下你在快餐店点一个汉堡,厨师会像这样一层一层地准备你的汉堡:
第一层:面包(第一层)。
第二层:肉饼(第二层)。
第三层:配料(第三层)。

让我们为这个场景写点代码,分别使用普通函数柯里化函数
📌 使用普通函数:
我们来看看,在普通函数中,所有参数会在一次调用中传入。

    function makeBurger(bun, patty, topping) {
        return `您的汉堡有:${bun}汉堡、${patty}肉饼和${topping}酱料。`;
    }

    const myBurger = makeBurger("芝麻", "混合蔬菜饼", "奶酪");
    console.log(myBurger); // 输出:您的汉堡:芝麻汉堡、混合蔬菜饼和奶酪酱。

切换到全屏模式,或者退出全屏模式

📌 调用柯里化函数:
每次调用,只需要传递一个参数。

    function makeBurgerCurried(bun) {
        return function (patty) {
            return function (topping) {
                return `您的汉堡是: ${bun} 包, ${patty} 肉饼, 和 ${topping} 配料。`;
            };
        };
    }

    // 示例
    const chooseBun = makeBurgerCurried("芝麻");
    const choosePatty = chooseBun("多种蔬菜");
    const myCurriedBurger = choosePatty("芝士");

    console.log(myCurriedBurger); // 结果为: 您的汉堡是: 芝麻包, 多种蔬菜肉饼, 和 芝士配料。

切换到全屏 退出全屏

✍️ 解释:
第一次调用时: makeBurgerCurried("Sesame") 接收 "Sesame" 并返回一个等待传入的饼的函数。

    const chooseBun = makeBurgerCurried("Sesame");
    console.log(chooseBun);
    /* 输出:
    function (patty) {
            return function (topping) {
                return `您的汉堡是:${bun} 面包,${patty} 肉饼,以及 ${topping} 配料。`;
            };
    }
    */

全屏 退出全屏

第二次调用时: chooseBun("Mix Veg") 接受 "Mix Veg" 并返回一个等待选择配料的函数。

const choosePatty = chooseBun("混合蔬菜");
console.log(choosePatty);
/* 函数 (topping) {
    return `您的汉堡有: ${bun} 汉堡包, ${patty} 肉排, 和 ${topping} 配料。`;
}

全屏模式。退出全屏。

第三次调用: choosePatty("Cheese") 接收 \"Cheese\" 并完成函数链并返回最终的汉堡描述信息。

    const myCurriedBurger = choosePatty("Cheese");
    console.log(myCurriedBurger); 
    // 打印输出: 这个汉堡有:芝麻面包、混合蔬菜肉饼以及芝士。

全屏模式,退出全屏

⭐ 箭头函数用于部分应用

你可以用箭头函数来简化柯里化的过程。

    const  curriedArrowFunction = (bun) => (patty) => (topping) =>
        `你的汉堡有:${bun}汉堡,${patty}肉排,${topping}顶料`

    const myArrowFunction = curriedArrowFunction("芝麻")("混合蔬菜")("奶酪")
    console.log(myArrowFunction); // 芝麻汉堡,混合蔬菜肉排,奶酪顶料

全屏 退出全屏

为什么要用柯里化(一种编程技术)?

柯里化(Currying)在你需重用带有特定参数的函数时特别有用。它有助于代码重用性、提高可读性并增强模块化。

💻 实际应用示例:打折计算器

想象你在开发一个电子商务平台。在这个平台上,促销折扣是根据客户类型计算的。

  • 常客可获得10%的折扣。
  • 贵宾客户可获得20%的折扣。

我们现在先用常规函数来试试这个折扣计算器:
📌 使用常规函数:
用常规函数来做折扣计算器可能会让代码不够灵活,复用性也不高。你得为不同类型的客户分别写函数,或者每次算折扣时都得传所有参数。

    function calculateDiscount(customerType, price) {
        if (customerType === "普通") {
            return price * 0.9; // 10%的折扣
        } else if (customerType === "高级") {
            return price * 0.8; // 20%的折扣
        }
    }

    console.log(calculateDiscount("普通", 100)); // 例如:输出 90
    console.log(calculateDiscount("高级", 100)); // 例如:输出 80

进入全屏 退出全屏

➖ 普通函数的限制:
</TRANSLATION>

  • 重复的逻辑问题:每次你都必须传递 customerType 参数,即使它在多次计算中没有变化。
  • 不可重用:如果你想在一个或多个交易中对某个客户类型应用折扣,你每次都需要指定该类型。
  • 可扩展性问题:添加更多客户类型或折扣规则会使功能变得更复杂,从而更难维护。

现在让我们使用柯里化函数来构建这个应用程序:
📌 使用柯里化函数:
柯里化允许你为不同的客户类型创建可重用的函数,这里加上逗号,使句子更加流畅。你无需反复提供相同的参数,这样更符合中文的习惯表达。而是为每种消费者类型配置折扣规则。这里的“逻辑”改为“规则”会更符合中文的习惯用语。

    function createDiscountCalculator(discountRate) {
        return function (price) {
            return price * (1 - discountRate);
        };
    }

    // 创建不同类型用户的特定计算器
    const regularDiscount = createDiscountCalculator(0.1); // 10% 折扣
    const premiumDiscount = createDiscountCalculator(0.2); // 20% 折扣

    // 用它们来计算
    console.log(regularDiscount(100)); // 显示: 90
    console.log(premiumDiscount(100)); // 显示: 80
    console.log(regularDiscount(200)); // 显示: 180

切换到全屏模式 点击退出全屏

➕ 柯里化函数的好处:

  • 可重用性:一旦指定了regularDiscountpremiumDiscount,后续交易时无需再重复指定折扣率。
  • 代码整洁:逻辑清晰且单一。每个函数都有单一的职责:定义和应用折扣率。
  • 可扩展性:创建新的客户类型非常简单。
    const studentDiscount = createDiscountCalculator(0.15); // 学生15%折扣
    console.log(studentDiscount(100)); // 输出结果为85

进入全屏 退出全屏

  • 提高可读性:代码清晰说明了它的目的。一个 regularDiscount 函数用于为普通客户计算折扣。
总结

乍一看,Currying 可能显得很复杂,但正如我们所见,它是一个强大的概念,可以简化函数定义,让你的代码更明了、更可复用。

既然你有了大致了解,试着在你的下一个项目中尝试一下柯里化,感受它的神奇之处吧!

分享你的想法
你有没有在项目中使用过柯里化技术,或者直接说是函数式编程中的部分应用技术?你遇到过哪些问题或好处?请在下面的评论区里告诉我!

祝你编码快乐!✨

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP