[Medium] 手写函式缓存 (cache function)

2023年1月7日

💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

在写程式时,如果不想做重复的复杂运算,我们经常会透过缓存 (cache) 来实现。缓存的意思是先把过去已经运算过的输出存起来,如果之后有同样的输入,未来就不用再运算一次,而是直接从缓存拿之前算过的,这能有效省去时间。因为缓存很好用,在实际工作上经常会用到,这也让缓存函式成了常考的面试题目。

手写函式缓存

以下是手写版本的缓存,可以先试着自行理解,往下滑会有注解的版本

function cached(fn) {
  const cache = {};

  return (...args) => {
    const key = JSON.stringify(args);
    if (key in cache) {
      return cache[key];
    } else {
      const val = fn(...args);
      cache[key] = val;
      return val;
    }
  };
}

如果上面的版本没有很懂,让我们一起来看看解说的版本

function cached(fn) {
  // 声明一个 cache 物件,透过 cache 来放缓存的东西
  // 因为闭包的缘故,下面回传的函式可以存取到这个 cache 变数
  const cache = {};

  // 透过扩展运算符,拿到引数
  return (...args) => {
    // 将引述当作缓存的 key
    const key = JSON.stringify(args);
    // 查看现在的缓存有没有这个 key,有的话就不用再算,直接回传
    if (key in cache) {
      return cache[key];
    } else {
      // 没有的话,就把收到引数带入,运算出结果
      const val = fn(...args);
      // 把结果放入缓存,下次有同样的 key 就不用重新运算
      cache[key] = val;
      return val;
    }
  };
}
🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們