闭包是实现记忆化函数最直接安全的方式:外层初始化私有缓存(如Map),内层查表或计算并缓存结果;推荐用Map作缓存容器以支持任意类型键;需规范键生成并防范内存泄漏、键失效和异步陷阱。
闭包是实现记忆化函数最直接、最安全的方式——它让缓存数据与函数逻辑天然绑定,既不污染全局,也不依赖外部状态,每次调用都能快速查表返回结果。
记忆化函数本质是一个“两层函数”:外层负责初始化私有缓存(如 Map 或普通对象),内层作为返回的函数,利用闭包持续访问该缓存。每次调用时,先比对参数是否已存在对应结果;命中则直返,未命中则执行原函数、存结果、再返回。
单参数函数可直接用参数作键,但实际中多数函数含多个参数或复杂类型。此时需将参数“归一化”为唯一、可比较的键:
undefined、function、循环引用会被丢弃或报错加了缓存不等于性能提升,几个常见疏漏反而拖慢系统:
.clear() 接口供手动清理{x: 1} 和 {x: 1} 是两个不同对象,Map 默认用 === 判断,永远不命中。必须序列化或标准化后再入键Promise.race() 或重载机制以下是一个兼顾多参数、类型安全与可读性的基础版:
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; };}
它适用于纯函数场景(输入相同必输出相同、无副作用)。如需支持 this 上下文,可改用 fn.apply(this, args);如需控制缓存大小,可替换为 LRU Map 实现。