JavaScript 中的柯里化

发布: (2026年2月5日 GMT+8 19:07)
3 min read
原文: Dev.to

Source: Dev.to

什么是柯里化?

柯里化是一种函数式编程技术,它将具有多个参数的函数转换为一系列函数,每个函数只接受一个参数:

f(a, b, c)   →   f(a)(b)(c)

它高度依赖 闭包:每个嵌套函数都保留对先前调用中提供的参数的访问权,从而在所有必需参数就绪之前累积值。 一旦收集到预期数量的参数,原始函数就会执行并返回最终结果。

简单示例

function orderCoffee(type) {
  return function (size) {
    return function (milk) {
      return `You selected ${type} ${size} with ${milk}`;
    };
  };
}

const orderOne   = orderCoffee('Latte')('Medium')('Almond milk');
const orderTwo   = orderCoffee('Americano')('Large')('No milk');
const orderThree = orderCoffee('Mocha')('Medium')('Almond milk');

console.log(orderOne);   // You selected Latte Medium with Almond milk
console.log(orderTwo);   // You selected Americano Large with No milk
console.log(orderThree); // You selected Mocha Medium with Almond milk

每一次调用都会捕获一条信息,并返回一个等待下一个输入的新函数。

内部工作原理

  1. 第一次调用orderCoffee('Latte')
    返回一个期待 size 的函数。type'Latte')通过闭包被记住。

  2. 第二次调用orderCoffee('Latte')('Medium')
    返回一个期待 milk 的函数。typesize 现在都已存储。

  3. 第三次调用orderCoffee('Latte')('Medium')('Almond milk')
    返回最终字符串,使用所有三个捕获的值。

箭头函数版本

箭头函数让相同的模式看起来更简洁:

const orderCoffee = (type) => (size) => (milk) =>
  `You selected ${type} ${size} with ${milk}`;

const order = orderCoffee('Latte')('Medium')('Almond milk');
console.log(order); // You selected Latte Medium with Almond milk

逐步拆解

步骤表达式返回值
1orderCoffee('Latte')等待 size 的函数
2orderCoffee('Latte')('Medium')等待 milk 的函数
3orderCoffee('Latte')('Medium')('Almond milk')最终字符串 "You selected Latte Medium with Almond milk"

为什么使用柯里化?

  • 可复用性 – 创建可以在不同剩余参数下重复使用的部分应用函数。
  • 可读性 – 将复杂调用拆分为更小、更能表达意图的步骤。
  • 组合 – 与函数组合、管道等其他函数式技术配合良好。

结论

柯里化将多参数函数拆分为一连串单参数函数,利用闭包记住先前的参数。此模式可以简化代码、促进复用,并自然地融入 JavaScript 的函数式编程风格。

Back to Blog

相关文章

阅读更多 »

方法链允许一系列函数

JavaScript 中的方法链 方法链涉及在同一个对象或其返回结果上依次调用多个方法。 这种模式在数组方法中很常见...