最轻量缓存方案是用闭包封装私有map缓存,支持任意类型键、避免json.stringify缺陷;需确保函数纯正,高频场景加lru控制内存,非纯函数或含dom引用者禁用。

直接用闭包封装一个私有缓存对象,让函数调用时先查缓存、命中就返回,没命中才执行计算并存结果——这是最轻量、最可控的优化方式。
缓存结构用 Map 而不是普通对象
Map 支持任意类型作键(比如数组、对象、NaN),不会出现对象转字符串后键冲突的问题。JSON.stringify 仅适合简单参数,遇到函数、Date、RegExp 或循环引用会出错或失效。
- 优先用 Map 存储,避免键误判
- 若参数是纯数字/字符串组合,可用
args.join('_')简单拼接,比 JSON.stringify 更快更安全 - 对复杂对象参数,建议引入
fast-deep-equal或自定义哈希函数生成稳定 key
写一个通用的 memoize 包装器
几行代码就能复用,不依赖第三方库:
function memoize(fn) {
const cache = new Map();
return function(...args) {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key);
const result = fn(...args);
cache.set(key, result);
return result;
};
}
- 用
...args支持多参数,兼容多数函数签名 - 返回新函数,原函数逻辑完全不变,零侵入
- 缓存生命周期与该函数实例绑定,不同 memoize 调用互不影响
高频场景要加内存控制
Canvas 绘图、实时动画、滚动监听等场景调用极频繁,缓存无限制会撑爆内存。
- 加 LRU 机制:只保留最近 N 条记录,淘汰最久未用项
- 或改用
lru-cache库,它已内置容量限制和过期策略 - 对固定参数组合(如 canvas 宽高、缩放比),可手动设计带条件刷新的缓存器,参数变则清空重算
注意哪些函数不能缓存
缓存只对纯函数有效——输入相同,输出必须恒定。
- 含 API 请求、
Date.now()、Math.random()的函数,缓存会掩盖变化,绝对禁用 - 修改外部状态(如 push 到全局数组)的函数,缓存后副作用消失,行为不可预期
- 参数含 DOM 元素或事件对象时,每次都是新引用,JSON.stringify 后 key 总不同,缓存无效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











