همونطور که گفتیم یک تابع Memoization خروجی قبلی خودش با یک آرگومان خاص رو ذخیره می‌کنه. نوشتن این تابع خیلی سادس. اینجا کلوژرها به کار ما میان. این تابع یک آرگومان می‌گیره. این آرگومان می‌تونه هر تابعی باشه؛ هر تابعی که می‌خوایم خروجی اون توی حافظه ذخیره بشه:

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

  return function (param) {
    if (cache[param]) {
      console.log('cached');
      return cache[param];
    } else {
      const result = fn(param);
      cache[param] = result;
      console.log(`not cached`);

      return result;
    }
  }
}

const toUpper = function (str) {
  return str.toUpperCase();
}

const toUpperMemoized = memoize(toUpper);

toUpperMemoized("abcdef"); // not cached
toUpperMemoized("abcdef"); // cached

تابع memoize ما اول بررسی می‌کنه که آیا تابعی که پاس داده شده با یک آرگومان مشخص، از قبل توی حافظه (اینجا متغیر cache) وجود داره یا نه که اگه وجود نداشت، ابتدا تابع پاس داده شده رو با آرگومانش اجرا می‌کنه و سپس خروجی اون رو میریزه توی حافظه. پس اگه دوباره این تابع با این آرگومان دوباره فراخونی شد، خود تابع اجرا نمیشه و فقط خروجی اون که توی حافظه هست برگردونده میشه.

 

منبع: