[Medium] 手寫函式緩存 (cache function)

2023年1月7日

💎 加入 E+ 成長計畫 如果你喜歡我們的內容,歡迎加入 E+,獲得更多深入的軟體前後端內容

在寫程式時,如果不想做重複的複雜運算,我們經常會透過緩存 (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 上追蹤我們