javascript中记忆函数通过闭包封装缓存对象实现,用map或对象存储参数与结果映射,支持键序列化或任意类型key,返回新函数查缓存或执行原函数,适用于纯函数且需注意参数序列化、this绑定及内存管理。

JavaScript 中通过闭包实现记忆函数(Memoization),核心是利用闭包捕获并持久化一个缓存对象,在后续相同输入时直接返回缓存结果,避免重复计算。
缓存结构用对象或 Map 存储键值对
闭包内部维护一个缓存容器(如 plain object 或 Map),把函数参数序列化为唯一 key,对应存储计算结果。推荐用 Map,它支持任意类型作为 key(比如对象、函数),且无原型链干扰;若只处理基本类型(数字、字符串),普通对象也够用。
- 简单场景:用
{},key 是JSON.stringify(args)(注意:仅适用于可序列化的参数) - 健壮场景:用
new Map(),key 可以是[...args](数组)或自定义 hash 函数生成的字符串
闭包封装原始函数与缓存逻辑
记忆函数本身是一个高阶函数,接收目标函数作为参数,返回一个新函数。这个新函数在执行时先查缓存,命中则返回;未命中则调用原函数、存结果、再返回。
- 闭包让缓存变量不被外部访问,保证私有性和数据隔离
- 每次调用记忆函数都会创建独立闭包,不同记忆实例互不影响
基础实现示例(支持单参数、基本类型)
以下是一个轻量、易理解的记忆函数:
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.apply(this, args);
cache.set(key, result);
return result;
};
}
<p>// 使用示例
const fib = memoize(n => n </p><h3>注意事项与优化点</h3><p>实际使用中需留意几个关键细节:</p>
-
参数不可变性:若传入对象或数组,
JSON.stringify可能因属性顺序、undefined、函数等导致 key 不一致,建议用更稳定的序列化方式或改用Map+ 数组作为 key -
this 绑定:上面示例用了
fn.apply(this, args),确保原函数的上下文正确;若不需要 this,可简化为fn(...args) - 内存控制:长期运行时缓存可能无限增长,可加 LRU 机制或最大容量限制(需额外维护访问顺序)
- 副作用函数慎用:记忆函数只适合纯函数(相同输入必得相同输出),含随机、时间、DOM 操作等副作用的函数不应缓存
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











