闭包缓存需用map存结果并支持任意参数类型,避免json.stringify;仅纯函数可用,须限制容量防内存泄漏,可封装为通用memoize工具。

用闭包存计算结果,核心是让函数“记住”自己算过什么——外层函数建一个私有缓存容器,内层函数调用时先查、再算、后存,靠作用域链长期持有这个缓存。
用 Map 做缓存容器,支持任意参数类型
别用普通对象当缓存,它会把数组、对象转成 [object Object] 导致键冲突。Map 能直接拿数组、NaN、甚至函数当 key,更可靠。
- 参数是数字或字符串组合?用
args.join('_')拼接,快又安全 - 参数含对象或嵌套结构?引入
fast-deep-equal判断是否相等,或自定义哈希逻辑(比如按字段名排序后 stringify) - 绝对避开 JSON.stringify 处理 Date、RegExp、undefined 或循环引用——它会出错或生成不稳定 key
只对纯函数做缓存,否则结果会“假”
缓存生效的前提是:输入相同,输出必须恒定。以下情况一概禁用缓存:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 函数里调用了
Date.now()、Math.random()、performance.now() - 发了网络请求(fetch/AJAX)、读写 localStorage
- 修改全局变量、push 到外部数组、触发 DOM 更新
- 参数是 DOM 元素、事件对象或函数——每次都是新引用,缓存基本不命中
高频场景必须加容量限制,防内存爆炸
Canvas 渲染、滚动监听、鼠标移动这类操作每秒可能调用几十次。无节制缓存会让 Map 越来越大,拖慢 GC 甚至卡顿。
- 手动实现 LRU:设上限(如 100 条),每次 set 前检查 size,超限就删最早 entry
- 直接用
lru-cache库,它已内置 max、ttl、dispose 回调等功能 - 对固定参数组合(如 canvas.width + scale),可设计“参数变则清空缓存”的条件刷新逻辑
封装成通用 memoize 工具,零侵入复用
几行代码就能写出可复用的缓存包装器,原函数完全不用改:
- 返回的新函数自带独立缓存,不同
memoize(fn)调用互不影响 - 缓存生命周期与该函数实例绑定,不污染全局
- 支持多参数传入(如
function(a, b, c) {...}可统一用数组[a,b,c]当 key)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










