函数柯里化是将多参数函数转换为一系列单参数函数,每次调用返回新函数直至所有参数传入,如curriedAdd(1)(2)(3);部分应用是固定部分参数生成新函数,仍可接收多个剩余参数,如double(3,4);两者调用方式、返回值和实现不同,柯里化用于逐步收集参数,部分应用用于简化函数调用。
函数柯里化(Currying)和部分应用(Partial Application)都是处理多参数函数的技巧,它们看起来相似,但核心机制和用途不同。
柯里化是将一个接受多个参数的函数转换为一系列只接受一个参数的函数。每次调用返回一个新的函数,直到所有参数都被传入。
例如:
function add(a, b, c) {
return a + b + c;
}
// 柯里化后
function curriedAdd(a) {
return function(b) {
return function(c) {
return a + b + c;
};
};
}
curriedAdd(1)(2)(3); // 6
关键点是:每一步只传一个参数,每一步都返回函数,直到最后一步才执行原函数。
部分应用是指固定一个函数的部分参数,生成一个新函数,这个新函数接收剩余的参数。
它不改变函数的调用方式,只是预先填入一些参数。
例如:
function multiply(a, b, c) { return a * b * c; }
// 部分应用:固定第一个参数为2 const double = multiply.bind(null, 2); double(3, 4); // 24
这里直接绑定了第一个参数,新函数仍接受多个参数,而不是逐个调用。
柯里化适合需要逐步收集参数的场景,比如配置生成器或事件处理器:
const greet = (greeting) => (name) => `${greeting}, ${name}!`;
const sayHello = greet("Hello");
sayHello("Alice"); // "Hello, Alice!"
部分应用更适合简化已有函数调用,比如固定 API 的基础参数:
const fetchUser = apiCall.bind(null, 'https://api.example.com', 'user');
fetchUser('123'); // 调用时只需传 ID
基本上就这些。两者都能提升函数复用性,但柯里化更强调“逐步求值”,部分应用更侧重“参数预设”。理解清楚有助于写出更灵活的代码。