JavaScript 中的柯里化
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
每一次调用都会捕获一条信息,并返回一个等待下一个输入的新函数。
内部工作原理
-
第一次调用 –
orderCoffee('Latte')
返回一个期待size的函数。type('Latte')通过闭包被记住。 -
第二次调用 –
orderCoffee('Latte')('Medium')
返回一个期待milk的函数。type和size现在都已存储。 -
第三次调用 –
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
逐步拆解
| 步骤 | 表达式 | 返回值 |
|---|---|---|
| 1 | orderCoffee('Latte') | 等待 size 的函数 |
| 2 | orderCoffee('Latte')('Medium') | 等待 milk 的函数 |
| 3 | orderCoffee('Latte')('Medium')('Almond milk') | 最终字符串 "You selected Latte Medium with Almond milk" |
为什么使用柯里化?
- 可复用性 – 创建可以在不同剩余参数下重复使用的部分应用函数。
- 可读性 – 将复杂调用拆分为更小、更能表达意图的步骤。
- 组合 – 与函数组合、管道等其他函数式技术配合良好。
结论
柯里化将多参数函数拆分为一连串单参数函数,利用闭包记住先前的参数。此模式可以简化代码、促进复用,并自然地融入 JavaScript 的函数式编程风格。