闭包实现缓存计算的核心是利用其记住词法环境的能力,在函数内维护私有、隔离的 cache 对象,确保不同函数缓存互不干扰;参数需稳定序列化为唯一 key,注意 JSON.stringify 的局限性;须透传 this 和多参数,并控制缓存生命周期防内存泄漏。

闭包实现缓存计算,核心是利用其“记住词法环境”的能力,在函数内部维护一个持久化的缓存对象,避免相同输入反复执行耗时逻辑。它不依赖外部状态,轻量、可控,特别适合纯函数场景。
用闭包封装缓存对象,避免全局污染
缓存必须私有且隔离,否则多个函数共用同一 cache 会互相干扰。闭包天然提供作用域封闭性:
- 每次调用 memoize(fn) 都生成独立的 cache = {} 对象
- 返回的新函数通过闭包持续访问该 cache,外部无法直接读写
- 不同被缓存函数(如
fib和expensiveCalc)拥有各自缓存,互不影响
参数需稳定序列化为唯一 key
缓存靠“输入 → 输出”映射,key 必须准确反映参数组合:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 单个基础类型参数(如
number、string)可直接用作 key - 多个参数或对象/数组,推荐用 JSON.stringify([...args]) 统一转字符串
- 注意:
undefined、function、Symbol、循环引用在 JSON 中会被忽略或报错,需提前校验或降级处理
保留 this 上下文与多参数支持
原始函数若依赖 this 或接收多个参数,缓存函数需正确透传:
立即学习“Java免费学习笔记(深入)”;
- 用 fn.apply(this, args) 而非
fn(...args),确保 this 指向不变 - args 接收类数组对象(如 arguments),再展开调用,兼容老旧环境
- 示例中
memoizedFibonacci(10)实际执行的是fibonacci.apply(this, [10])
注意缓存生命周期与内存控制
闭包让 cache 长期驻留内存,不加约束易导致内存增长:
- 高频调用 + 参数组合多 → 缓存无限膨胀,可用 Map 替代 Object 并限制 size
- 长期持有大型数据(如缓存了 10MB 的 API 响应)→ 应配合过期时间或手动清理机制
- 不再需要缓存时,可将返回的函数设为 null,帮助垃圾回收释放关联变量


















