闭包缓存通过在私有作用域中保存计算结果,实现相同输入直接返回缓存值,适用于纯函数场景;常用做法是返回记忆化函数,内部用对象或map存储key→result映射,并确保cache不被外部篡改。

用闭包缓存高频计算结果,核心是把计算结果存在闭包的私有作用域里,后续相同输入直接返回缓存值,避免重复执行耗时逻辑。关键在于“输入确定、结果不变”的纯函数场景。
用闭包封装缓存对象
闭包能维持内部变量的引用,适合保存 cache 映射表。常见做法是返回一个带记忆功能的函数:
- 内部用对象或 Map 存 key → result 映射
- 每次调用先查缓存,命中则返回;未命中则计算、存入、再返回
- 闭包确保 cache 不被外部篡改,也不污染全局作用域
例如斐波那契数列的记忆化实现:
const memoFib = (function() {
const cache = {};
return function(n) {
if (n in cache) return cache[n];
if (n 处理复杂参数(如对象或数组)
普通对象作 key 会转成 [object Object],导致缓存失效。需规范化参数为唯一字符串 key:
- 简单情况:用
JSON.stringify(args)(要求参数可序列化且顺序固定) - 更健壮:用
args.map(String).join('|')或自定义 key 生成逻辑(比如只取对象特定字段) - 注意:深对象、函数、undefined、Symbol 等无法被 JSON 安全序列化,需按需过滤或报错提示
控制缓存生命周期和大小
无限制缓存可能内存泄漏。可加简单策略:
- 设最大容量(如 LRU 缓存),用 Map + 数组记录访问顺序,超限时删最久未用项
- 加过期时间:缓存项存 { value, timestamp },读取时检查是否超时
- 对外暴露
clear()方法,方便测试或主动刷新
用工具函数统一抽象记忆逻辑
避免每个函数都手写缓存,可封装通用 memoize 工具:
function memoize(fn, getKey = JSON.stringify) {
const cache = new Map();
return function(...args) {
const key = getKey(args);
if (cache.has(key)) return cache.get(key);
const result = fn.apply(this, args);
cache.set(key, result);
return result;
};
}
<p>// 使用
const expensiveCalc = memoize((a, b) => {
console.log('running...');
return a ** b;
});
expensiveCalc(2, 10); // running... → 1024
expensiveCalc(2, 10); // 直接返回 1024</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











