如何清除JavaScript记忆化函数缓存

来源:Java编程网作者:杨建军头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何清除JavaScript记忆化函数缓存》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何清除JavaScript记忆化函数缓存》有用,将其分享出去将是对创作者最好的鼓励。

记忆化函数通过将函数的输入参数和对应的计算结果进行缓存,当再次传入相同参数时直接返回缓存结果,避免重复执行复杂计算。但在缓存数据过期、内存不足或者需要重新获取最新数据的场景下,就需要清除已有的缓存内容。以下是几种常用的清除JavaScript记忆化函数缓存的实现方式。

如何清除JavaScript记忆化函数缓存

直接暴露缓存对象引用

实现记忆化函数时,将缓存对象作为返回函数的一个属性暴露出来,外部可以直接操作这个属性来清除缓存。这种方式实现简单,适合简单的使用场景。

// 实现记忆化函数
function memoize(fn) {
  const cache = new Map();
  // 返回的记忆化函数
  const memoizedFn = 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;
  };
  // 将缓存对象挂载到函数上
  memoizedFn.cache = cache;
  return memoizedFn;
}

// 示例函数:计算两数之和
function add(a, b) {
  console.log('执行计算');
  return a + b;
}

const memoizedAdd = memoize(add);
console.log(memoizedAdd(1, 2)); // 输出 执行计算 3
console.log(memoizedAdd(1, 2)); // 输出 3,使用缓存

// 清除缓存
memoizedAdd.cache.clear();
console.log(memoizedAdd(1, 2)); // 输出 执行计算 3,重新计算

提供专用的清除缓存方法

如果不想直接暴露整个缓存对象,避免外部误操作修改缓存结构,可以在返回的记忆化函数上添加一个专门的清除缓存方法,封装清除逻辑。

function memoizeWithClear(fn) {
  const cache = new Map();
  const memoizedFn = 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;
  };
  // 添加清除缓存的方法
  memoizedFn.clearCache = function() {
    cache.clear();
  };
  // 可选:添加获取缓存大小的方法
  memoizedFn.getCacheSize = function() {
    return cache.size;
  };
  return memoizedFn;
}

function multiply(a, b) {
  console.log('执行乘法计算');
  return a * b;
}

const memoizedMultiply = memoizeWithClear(multiply);
console.log(memoizedMultiply(2, 3)); // 输出 执行乘法计算 6
console.log(memoizedMultiply(2, 3)); // 输出 6
console.log(memoizedMultiply.getCacheSize()); // 输出 1

// 调用清除方法
memoizedMultiply.clearCache();
console.log(memoizedMultiply.getCacheSize()); // 输出 0
console.log(memoizedMultiply(2, 3)); // 输出 执行乘法计算 6

使用WeakMap实现自动缓存清除

如果记忆化函数的参数是对象类型,可以使用WeakMap存储缓存,WeakMap的键是弱引用,当对象没有其他引用时会被自动垃圾回收,无需手动清除缓存,适合参数为对象的场景。

function memoizeWithWeakMap(fn) {
  const cache = new WeakMap();
  return function(arg) {
    // 仅支持单个对象参数,如需多参数可调整key生成逻辑
    if (cache.has(arg)) {
      return cache.get(arg);
    }
    const result = fn.call(this, arg);
    cache.set(arg, result);
    return result;
  };
}

// 示例函数:获取对象的属性数量
function getObjPropCount(obj) {
  console.log('计算对象属性数量');
  return Object.keys(obj).length;
}

const memoizedGetPropCount = memoizeWithWeakMap(getObjPropCount);
const testObj = { a: 1, b: 2 };
console.log(memoizedGetPropCount(testObj)); // 输出 计算对象属性数量 2
console.log(memoizedGetPropCount(testObj)); // 输出 2,使用缓存

// 移除testObj的引用后,WeakMap中的缓存会被自动回收
// 实际应用中无需手动清除,依赖垃圾回收机制即可

不同清除方式的适用场景

可以根据实际开发需求选择合适的缓存清除方式,以下是不同方式的特点对比:

清除方式优点缺点适用场景
暴露缓存引用实现简单,可直接操作缓存缓存结构完全暴露,易被误操作简单工具函数,内部使用场景
提供专用清除方法封装清除逻辑,安全性更高需要额外定义方法对外提供的公共记忆化函数
WeakMap自动清除无需手动清除,内存友好仅支持对象作为键,兼容性稍弱参数为对象的记忆化场景

注意事项

  • 生成缓存键时如果使用JSON.stringify,要注意参数中包含函数、循环引用等无法序列化的情况,需要自定义键生成逻辑。
  • 手动清除缓存后,如果后续还需要使用记忆化功能,函数会重新计算并缓存新结果,不会影响后续使用。
  • 如果记忆化函数需要支持多上下文调用,缓存时要注意this的指向问题,必要时将上下文也作为缓存键的一部分。

memoizationclosure缓存清除JavaScript修改时间:2026-07-01 14:30:17

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。