首页 > web前端 > js教程 > 柯里化:解锁 JavaScript 的模块化超能力

柯里化:解锁 JavaScript 的模块化超能力

Susan Sarandon
发布: 2024-12-09 12:02:24
原创
894 人浏览过

Currying: Unlocking the Modular Superpower of JavaScript

目录

  • 介绍
  • 柯里化到底是什么?
  • 柯里化分步指南
  • 为什么要关心柯里化?
  • 自动化柯里化(因为寿命太短)
  • TypeScript 和柯里化:永远的朋友
  • 关于陷阱的快速说明
  • 结论

简介

是否曾经看着你的代码并想:“哇,这和我的袜子抽屉一样井井有条吗?”好吧,你并不孤单。尽管 JavaScript 有其怪癖和魅力,但它也可能会变得混乱。柯里化是一种来自函数式编程的神奇技术,它使您的代码模块化、可重用,而且我敢说很优雅。如果这听起来像魔法,请系好安全带。我们即将潜入。


柯里化到底是什么?

柯里化听起来像是在厨房里做的事情,但在 JavaScript 中,它是将具有多个参数的函数转换为一系列函数的艺术,每个函数都采用一个参数。将其视为将复杂的食谱分解为小步骤。

这是一个简单的例子:

function multiply(a: number, b: number) {
  return a * b;
}
登录后复制
登录后复制

很酷,对吧?但这个函数需要预先提供两个参数。如果你还没有准备好同时致力于两者(谁是,真的吗?),柯里化可以让你这样称呼它:

const curriedMultiply = (a: number) => (b: number) => a * b;

// Create reusable specialized functions
const double = curriedMultiply(2);
const triple = curriedMultiply(3);

console.log(double(4)); // Output: 8
console.log(triple(4)); // Output: 12
登录后复制
登录后复制

繁荣!现在您可以一次传递一个参数,就像组装三明治一样。现在您已经看到了一个简单的柯里化函数,让我们学习如何一步步构建。


柯里化分步指南

  1. 从多参数函数开始
    假设您有一个带有多个参数的函数:

    function add(a: number, b: number, c: number) {
      return a + b + c;
    }
    
    登录后复制
    登录后复制
  2. 分层包裹
    将其转换为一系列函数:

    const curriedAdd = 
      (a: number) => (b: number) => (c: number) => a + b + c;
    
    登录后复制
    登录后复制
  3. 一次传递一个参数
    一次调用每一层:

    const step1 = curriedAdd(2); // Fixes the first argument (a = 2)
    const step2 = step1(3);      // Fixes the second argument (b = 3)
    const result = step2(4);     // Fixes the third argument (c = 4)
    
    console.log(result);         // Output: 9
    
    登录后复制
    登录后复制
  4. 从灵活性中获益
    现在您有了可重复使用的小步骤,使您的代码更加模块化。


为什么要关心柯里化?

柯里化可能听起来很花哨,但它有现实世界的好处:

  • 模块化:将大函数分解为小的、可测试的部分。
  • 可重用性:使用现有代码创建专门的函数版本。
  • 可读性:你的代码变得不言自明,就像一本写得好的小说(或者至少是一本像样的小说)。

让我们花点时间记住为什么可读性很重要。代码不仅仅是为机器编写的——它们会理解你扔给它们的任何东西。它是为人类编写的——你的同事、未来的你以及下一个需要修改它的人。好的代码应该旨在易于理解、测试和修改。柯里化通过将逻辑分解为更小、更清晰、一目了然的部分来帮助实现这一目标。

假设您正在过滤对象列表:

function multiply(a: number, b: number) {
  return a * b;
}
登录后复制
登录后复制

或计算税费:

const curriedMultiply = (a: number) => (b: number) => a * b;

// Create reusable specialized functions
const double = curriedMultiply(2);
const triple = curriedMultiply(3);

console.log(double(4)); // Output: 8
console.log(triple(4)); // Output: 12
登录后复制
登录后复制

每个函数只做一件事,使您的代码更易于阅读、理解和测试。通过创建更小的、专门的函数,柯里化使复杂的逻辑变得简单、可重用,并且对于以后处理它的人来说是可维护的。


自动化柯里化(因为生命太短)

手动输入所有这些嵌套函数?不,谢谢。让我们自动化柯里化:

function add(a: number, b: number, c: number) {
  return a + b + c;
}
登录后复制
登录后复制

工作原理如下:

  1. 如果参数数量与原始函数匹配,则调用该函数。
  2. 否则,它返回一个等待更多参数的新函数。

示例:

const curriedAdd = 
  (a: number) => (b: number) => (c: number) => a + b + c;
登录后复制
登录后复制

它就像一个争论的自动售货机:一次放入一个或一次放入所有。


TypeScript 和柯里化:永远的朋友

通过 TypeScript 中的类型安全将柯里化提升到新的水平:

const step1 = curriedAdd(2); // Fixes the first argument (a = 2)
const step2 = step1(3);      // Fixes the second argument (b = 3)
const result = step2(4);     // Fixes the third argument (c = 4)

console.log(result);         // Output: 9
登录后复制
登录后复制

TypeScript 示例:

const filterByKey = (key: string) => (value: any) => (data: any[]) =>
  data.filter((item) => item[key] === value);

// Create a reusable filter for colors
const filterByColor = filterByKey("color");
const redItems = filterByColor("red");

console.log(redItems([{ color: "red" }, { color: "blue" }])); 
// Output: [{ color: "red" }]
登录后复制

您的 IDE 将指导您完成每一步。


关于陷阱的快速说明

柯里化函数失去了原来的 this 上下文。如果您需要使用带有柯里化的类方法,请使用 .bind(this) 或箭头函数。


结论?

柯里化就像用作弊代码升级你的编码游戏。通过将函数分解为更小的、可管理的部分,您可以获得灵活性、可读性和成就感(或者至少减少令人头痛的调试问题)。无论您是自动化还是手动编写,柯里化都会将您的代码变成一个干净的、模块化的强大库。

正如 Haskell Curry(名字背后的人)可能会说的:

“少写,多做……一次一个论点!”

以上是柯里化:解锁 JavaScript 的模块化超能力的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板