柯里化累加函数的核心是延迟求值、参数累积与终止触发,通过闭包保存数字数组,支持空参调用、隐式转换(toString/valueOf)或哨兵值(null/undefined)来结束累积并返回结果。

柯里化函数处理不固定数量参数的累加,核心在于**延迟求值 + 参数累积 + 终止触发**。它不是一次性接收所有参数,而是每次调用接收一部分,直到满足终止条件(比如无参调用、传入特殊标记、或达到预设阈值)才真正执行累加。
用闭包累积参数,空参数触发计算
最常见且自然的方式是:每次调用都把新参数收集起来,当再次调用时没传参数(即 arguments.length === 0),就返回当前累加结果,并重置状态(如果支持重复使用)或结束。
- 利用闭包保存已收集的数字数组
- 函数本身可被反复调用追加参数
- 不传参时返回 sum,同时保持函数仍可继续柯里化(可选)
function curryAdd() {
const nums = [];
function add(...args) {
if (args.length === 0) return nums.reduce((a, b) => a + b, 0);
nums.push(...args);
return add;
}
return add;
}
const sum = curryAdd();
console.log(sum(1)(2)(3)()); // 6
console.log(sum(10)(20)()); // 30
用 toString/valueOf 隐式转换触发求值
为了让柯里化函数在参与表达式(如 console.log、字符串拼接)时自动出结果,可重写 toString 或 valueOf 方法。这是 JS 特有的技巧,让函数“看起来像数字”。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 每次调用只收集参数,不立即计算
- 当环境需要原始值(如
+sum、'' + sum、console.log(sum))时,自动触发累加 - 注意:
toString用于字符串上下文,valueOf更适合数值运算
function curryAdd() {
const nums = [];
function add(...args) {
if (args.length) {
nums.push(...args);
return add;
}
return nums.reduce((a, b) => a + b, 0);
}
add.toString = add.valueOf = function() {
return nums.reduce((a, b) => a + b, 0);
};
return add;
}
const sum = curryAdd();
console.log(sum(1)(2)(3) + 10); // 16
console.log(`${sum(5)(15)}`); // "20"
支持显式结束符(如 null、undefined、空数组)
有些场景需要明确告诉函数“参数收完了”,比如传入 null、undefined 或一个空数组作为哨兵值。这种方式语义清晰,不易误触发。
立即学习“Java免费学习笔记(深入)”;
- 约定某个特殊值为终止信号(推荐
undefined或null) - 每次检查首参数是否为哨兵,是则返回结果;否则继续累积
- 避免和合法数值(如 0)冲突,所以不用假值直接判断
function curryAdd() {
const nums = [];
return function add(...args) {
if (args.length && (args[0] === undefined || args[0] === null)) {
return nums.reduce((a, b) => a + b, 0);
}
nums.push(...args);
return add;
};
}
const sum = curryAdd();
console.log(sum(1)(2)(3)(null)); // 6
console.log(sum(100)(undefined)); // 100
兼顾链式调用与立即执行的混合模式
实际开发中,有时希望既能链式累加,也能随时用括号立刻执行(类似 sum(1,2,3)())。这时可让函数同时支持多参调用和单参柯里化。
- 若本次调用有参数,就累积并返回自身
- 若本次调用无参数,就计算并返回结果
- 若本次调用多个参数(如
sum(1,2)),也累积后返回自身,保持一致性
function curryAdd() {
const nums = [];
function add(...args) {
if (args.length === 0) {
return nums.reduce((a, b) => a + b, 0);
}
nums.push(...args);
return add;
}
return add;
}
不复杂但容易忽略细节:关键是决定“何时算”,然后用闭包存状态,再靠调用约定(空参、哨兵、隐式转换)来触发。选哪种方式,取决于你的使用场景和团队可读性偏好。

















