# 缓存memoize

function memoize(func, resolver) {
  if (typeof func !== 'function' || (resolver != null && typeof resolver !== 'function')) {
    throw new TypeError('Expected a function');
  }
  const memoized = function(...args) {
    const key = resolver ? resolver.apply(this, args) : args[0];
    const cache = memoized.cache;
    
    if (cache.has(key)) {
      return cache.get(key);
    }
    const result = func.apply(this, args);
    memoized.cache = cache.set(key, result) || cache;
    return result;
  };
  memoized.cache = new (memoize.Cache || Map);
  return memoized;
}

memoize.Cache = Map;
// 使用举例——斐波拉契

// 这里的f已经返回了memoized函数了。
// 而memoize只会执行一次。
const f = memoize(n => n < 2 ? 1 : f(n - 1) + f(n -2));
for(let i = 1; i <= 10; i++) {
    f(i);
}

这段代码稍微有点绕,有点意思。

这里使用了闭包返回了memoized函数,通过对比Map中是否存在key

  • 存在、直接返回缓存数据。
  • 不存在、执行函数并将结果缓存。

还有一句代码是这里:

memoized.cache = new (memoize.Cache || Map);

这一句代码,相当于memoized的构造函数是可以用户自己替换的,默认为Map。

resolver表示,用户可以自定义key的值,否则默认以传入的第一个数据为key的值。

# 缓存池

const MAX_MEMOIZE_SIZE = 500;
function memoizeCapped(func) {
  const result = memoize(func, key => {
    const {cache} = result;
    if (cache.size === MAX_MEMOIZE_SIZE) {
      cache.clear();
    }
    return key;
  });
  
  return result;
}

设置了缓存最多的数量为500,如果缓存数量超过500,则会清空之前的全部缓存。

最近更新时间: 2020/9/6 11:30:38