javascript函数柯里化是将多参数函数转换为单参数链式调用的过程,核心靠闭包保存已传参数,待参数数达fn.length时执行原函数;支持固定参数、部分应用及显式触发等实用变体。

JavaScript 中函数柯里化是将一个接收多个参数的函数,转换为一系列只接收单个参数的函数的过程。它本质是“参数分步传入、延迟求值”,从而实现多参数函数的“降维”——把 f(a, b, c) 拆成 f(a)(b)(c) 这样的链式调用结构。
核心原理:闭包保存已传参数
每次调用柯里化函数时,它不立即执行原函数,而是用闭包记住已传入的参数,返回一个新函数等待后续参数。当累积参数数量达到原函数要求时,才真正调用原函数并返回结果。
- 利用
arguments或剩余参数(...args)收集当前调用的参数 - 用闭包维持已传入的参数列表(如用数组
savedArgs累积) - 判断参数总数是否满足原函数的形参个数(
fn.length),满足则执行,否则返回继续接收参数的新函数
手写基础柯里化函数(支持固定参数个数)
适用于明确知道原函数期望参数个数的场景,例如 add(a, b, c):
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
}
};
}
// 使用示例
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
增强版:支持提前绑定 + 自动执行(更实用)
真实项目中常需部分应用(partial application)和灵活触发。下面版本支持:任意次数传参、自动执行、可显式调用 () 触发计算:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
}
return function(...nextArgs) {
return curried.apply(this, [...args, ...nextArgs]);
};
};
}
// 进阶技巧:支持显式结束调用(如调用无参时执行)
function curryAuto(fn) {
const curried = function(...args) {
if (args.length === 0) return fn.apply(this, curried.savedArgs || []);
curried.savedArgs = [...(curried.savedArgs || []), ...args];
if (curried.savedArgs.length >= fn.length) {
const result = fn.apply(this, curried.savedArgs);
curried.savedArgs = []; // 重置,支持复用
return result;
}
return curried;
};
return curried;
}
注意:第二种方式更适合命令式风格(如 curryAuto(fn)(1)(2)()),但需手动管理状态;第一种更函数式、无副作用,推荐优先使用。
实际应用场景举例
柯里化不是炫技,它在以下场景显著提升代码表达力和复用性:
-
配置复用:如
const logError = curry(console.error)('ERROR:'),后续只需传具体消息 -
事件处理器预设参数:如
button.addEventListener('click', curry(handleClick)(id)) -
与函数式工具链配合:和
map、filter结合时避免匿名函数,例如[1,2,3].map(curry(Math.pow)(2))表示“每个数的平方” -
API 封装降噪:把
axios.get(url, config)柯里化为const get = curry(axios.get)(defaultConfig),简化调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











