闭包结合柯里化实现延迟计算累加器,本质是用闭包维持sum状态、柯里化支持链式调用与按需求值;通过valueof/tostring实现隐式转换,工厂函数可创建多个隔离实例。

闭包结合柯里化实现延迟计算的累加器,本质是用闭包维持内部状态(如当前总和),再通过柯里化支持链式传参、不立即求值,直到显式触发或隐式转换时才返回结果。它不是一调用就出答案,而是“边加边记、随时可取”。
核心机制:闭包存状态,柯里化控流程
闭包确保 sum 变量在多次函数调用中持续存在且不被回收;柯里化则让每次调用都返回新函数,形成链式结构,把“是否继续累加”和“何时输出结果”的控制权交给使用者。
- 外部函数初始化 sum,并返回内部累加函数
- 内部函数接收参数:有参则更新 sum 并返回自身;无参或触发隐式转换时返回当前 sum
- 利用 valueOf 和 toString 方法,让累加器能直接参与数值运算(如
+add(1)(2))或打印(console.log(add(1)(2)))
基础实现:支持空调用与隐式转换
这是最常用也最实用的写法,简洁可靠:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function add(...initial) {
let sum = initial.reduce((a, b) => a + b, 0);
function curried(...args) {
if (args.length === 0) return sum;
sum += args.reduce((a, b) => a + b, 0);
return curried;
}
curried.toString = () => String(sum);
curried.valueOf = () => sum;
return curried;
}
-
add(1)(2)(3)()→ 返回 6 -
+add(1)(2)(3)→ 自动调用 valueOf,得 6 -
console.log(add(5)(10))→ 触发 toString,输出 "15"
进阶需求:多个独立累加器互不干扰
如果项目中需要多个并行累加场景(比如分别统计用户点击数、API 调用次数、表单提交量),不能共用一个 sum。这时应封装为工厂函数,每次调用都生成全新闭包:
function createAdder(initial = 0) {
let sum = initial;
function adder(...args) {
if (args.length === 0) return sum;
sum += args.reduce((a, b) => a + b, 0);
return adder;
}
adder.toString = () => String(sum);
adder.valueOf = () => sum;
return adder;
}
const clicks = createAdder();
const apiCalls = createAdder(100);
clicks(1)(2)(3)(); // 6
apiCalls(5)(10)(); // 115
- 每个实例都有自己的 sum,彼此隔离
- 初始值可选,默认为 0,便于复用
为什么能延迟计算?关键在“不执行、只返回”
每次调用都只是更新内部状态并返回函数本身,真正求值的时机由使用者决定:
- 显式调用空括号
()是主动求值信号 - 参与算术运算(
+、-)、比较(==)、打印(console.log)会自动触发 valueOf 或 toString - 中间过程完全不依赖外部变量,也不暴露 sum,安全性与封装性兼备
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










