JavaScript 中的柯里化 (Currying)

2025年3月18日 | 阅读时长 4 分钟

在本文中,我们将讨论 JavaScript 中的柯里化。在这里,我们将了解柯里化如何工作以及它对软件开发人员有何帮助。我们还将了解如何将现有函数转换为柯里化版本。因此,本文对于 JavaScript 阅读者来说将非常有趣且重要。在这里,您将学习 JavaScript 中的一个新概念。废话不多说,让我们开始我们重要的主题,即 JavaScript 中的柯里化 JavaScript

什么是柯里化?

柯里化被定义为将一个具有多个参数的函数更改为一系列具有单个参数的函数。它是一个将具有更多元数的函数转换为具有更少元数的函数的过程。术语 **元数 (arity)** 表示函数中的参数数量。

它是一种函数转换,可以将函数从可以调用为 **add(1, 2, 3)** 的形式,转换为可以调用为 **add(1)(2)(3)** 的形式。它只转换函数而不是调用它。它会返回一个新函数,直到所有参数都用完为止。

假设有一个带 some 参数的函数,它不会一次性接收所有参数,而是接收第一个参数,然后返回一个接收第二个参数的新函数,该函数返回一个接收第三个参数的新函数,依此类推,直到所有参数都满足。

例如,假设有一个函数 **fun**,它有三个参数 **A、B** 和 **C**,并且它返回一个值 **res**。当它被柯里化时,它将被分解为三个函数,假设为 **X、Y** 和 **Z**。新函数 **X** 将 **A** 作为参数并返回函数 **Y**,该函数将 **B** 作为参数并返回函数 **Z**,该函数将 **C** 作为参数,并最终返回所需的值 **res**。

柯里化的好处

  • 柯里化有助于避免反复传递相同的变量。
  • 它在事件处理中很有用。
  • 编写易于重用和配置的小型代码模块。

如何在 JavaScript 中实现柯里化?

JavaScript 默认没有内置柯里化(至少在当前版本中不存在)。使用一些函数式技巧,我们也可以在 JavaScript 中实现柯里化。我们可以通过两种方法实现柯里化 -

  • 可以使用 **bind()** 方法实现
  • 可以使用 **闭包 (closures)** 实现

使用 bind() 方法实现柯里化

JavaScript 函数的 **bind()** 方法用于创建一个新函数。当调用一个函数时,它的 **this** 关键字被设置为提供的值,并带有一系列给定的参数。现在,让我们使用 JavaScript 中的 **bind()** 方法来实现柯里化。

示例

在此示例中,我们使用 **bind()** 方法来实现 JavaScript 中的柯里化。**bind()** 方法会给我们 **mul()** 方法的一个副本,而不会直接调用它。在这里,我们永久分配第一个参数值,然后通过分配第二个参数值来重用 **var1** 和 **var2** 方法。

因此,通过这种方式,我们可以使用柯里化重用我们的函数。

输出

Currying in JavaScript

使用闭包实现柯里化

闭包也使得 JavaScript 中的柯里化成为可能。闭包可以被定义为 JavaScript 的一个特性,其中内部函数可以访问外部函数的变量。在 JavaScript 中,每次函数创建时都会创建一个闭包。

输出

10
12

如何将现有函数转换为柯里化版本?

现在,让我们看看如何将现有函数转换为其柯里化版本。

不使用柯里化

这里有一个简单的函数,我们没有使用柯里化。

输出

80

柯里化后

现在,我们将柯里化应用于上面示例中的函数。让我们看一个 JavaScript 中柯里化的例子。

输出

80

在上面的代码中,我们使用了柯里化,即参数一个接一个地传递,直到最后一个函数调用最后一个参数。因此,在对同一个函数使用柯里化之前和之后,使用相同的参数,输出将保持不变。

这就是本文的全部内容。希望您能理解柯里化的概念以及实现它的过程。