You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现传入相同参数时阻止复杂函数重复调用?

memo缓存函数实现方案

实现思路

  • 利用闭包存储缓存结果,避免全局变量污染
  • 将传入的参数序列化为唯一的缓存key,判断是否已经有对应缓存
  • 存在缓存直接返回结果,不存在则执行原函数,存储结果后返回

完整实现代码

const complexFunction = (arg1, arg2) => { 
  /* 此处为复杂计算逻辑 */ 
  console.log('complexFunction');
  return true;
};

// memo缓存函数实现
const memo = (fn) => {
  // 闭包存储缓存,用Map扩展性更强
  const cache = new Map();
  return function(...args) {
    // 生成缓存key:序列化参数作为唯一标识
    const key = JSON.stringify(args);
    if (cache.has(key)) {
      // 存在缓存直接返回
      return cache.get(key);
    }
    // 不存在缓存则执行原函数,用apply保证this指向正确
    const result = fn.apply(this, args);
    // 存储结果到缓存
    cache.set(key, result);
    return result;
  }
}

const memoComplex = memo(complexFunction);

// 测试
memoComplex(1, 2); // 打印 complexFunction
memoComplex(1, 2); // 无打印,直接返回缓存结果
memoComplex(1, 3); // 打印 complexFunction

注意事项

  • 当前实现用JSON.stringify序列化参数生成key,不适用于参数包含循环引用、函数、Symbol类型的场景,如果需要支持这类参数,可以替换为自定义的序列化逻辑
  • 缓存默认永久存储,如果调用时参数组合非常多,会占用额外内存,可根据业务需求添加缓存过期时间、LRU缓存淘汰策略优化
  • 如果需要对参数做引用相等性判断而非值相等,可直接将参数数组作为Map的key,无需序列化处理

内容的提问来源于stack exchange,提问作者elad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:27:05