柯里化是将多参数函数转换为单参数函数链的机制,通过闭包记忆已传参数,直至参数总数满足才执行;它强制分步调用,而部分应用更灵活,可一次预填任意数量参数。
Currying(柯里化) 是把一个接收多个参数的函数,转换成一系列只接收一个参数的函数链。它不是简单地“少传几个参数”,而是固定前几个参数,返回一个新函数等待剩余参数——这正是实现部分应用(partial application)的核心机制。
每次调用柯里化后的函数,它会记住已传入的参数,直到参数总数满足原函数要求才真正执行。关键靠闭包保存中间状态。
f(a, b, c)
f(a)(b)(c) 或 f(a)(b, c)(取决于实现策略)partial(f, a) → 返回 (b, c) => f(a, b, c),可一次传多个剩余参数用闭包和递归判断参数是否齐备:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
}
return function(...moreArgs) {
return curried.apply(this, args.concat(moreArgs));
};
};
}
// 使用示例
const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1)(2, 3)); // 6
容易混淆,但关键在参数传递方式和灵活性:
_.partial 或 bind)ES6+ 可写出更简洁的柯里化工具:
const curry = (fn) => {
const go = (...args) =>
args.length >= fn.length
? fn(...args)
: (...more) => go(...args, ...more);
return go;
};
这种写法轻量、可读性好,也方便组合(如配合 compose 或 pipe 做函数式编程)。
基本上就这些。柯里化本身不复杂,但容易忽略它和部分应用的语义差别——前者是形式契约,后者是实用目标;用对了,能写出更清晰、可复用的函数逻辑。