柯里化是将多参函数转为单参函数链的转换技术,核心是递归收集参数直至满足原函数形参个数后执行;典型场景包括预设配置、事件复用、工具函数组合及日志增强;需注意参数顺序、函数类型及性能开销。
函数柯里化(Currying)是指将一个接收多个参数的函数,转换为一系列只接收一个参数的函数链。每次调用返回一个新的函数,直到所有参数都传入后才执行原逻辑。
核心思路是:保存已传参数,递归等待剩余参数,当参数数量满足原函数要求时触发执行。
简单手写示例:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...moreArgs) {
return curried.apply(this, args.concat(moreArgs));
};
}
};
}
// 使用示例
function add(a, b, c) {
return 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
它不是炫技,而是解决具体问题的实用模式:
map、filter 配合柯里化后更易组合,例如 const isGreaterThan = curry((a, b) => b > a); const isPositive = isGreaterThan(0);
容易混淆但关键不同:
柯里化虽灵活,但别滥用:
arguments 获取长度,用 fn.length 判断时需确保原函数是普通函数声明/表达式