js的缓存函数

209 阅读2分钟

缓存函数

缓存函数是一种常见的优化技术,它可以在函数被多次调用时缓存结果,避免重复计算,从而提高程序的性能。在JavaScript中,我们可以使用闭包和对象来实现缓存函数。

闭包实现

闭包是一种可以访问外部函数作用域的函数。我们可以利用闭包来实现一个简单的缓存函数。下面是一个例子:

function memoize(func) {
  const cache = {};
  return function(...args) {
    const key = JSON.stringify(args);
    if (cache[key]) {
      return cache[key];
    }
    const result = func.apply(this, args);
    cache[key] = result;
    return result;
  };
}

这个函数接受一个函数作为参数,并返回一个新的函数。新函数会先检查缓存中是否已经有了对应参数的结果,如果有则直接返回缓存中的结果,否则调用原函数计算结果,并将结果存入缓存中。

使用这个函数可以很方便地将一个普通函数转换为缓存函数。例如:

function fibonacci(n) {
  if (n <= 1) {
    return n;
  }
  return fibonacci(n - 1) + fibonacci(n - 2);
}

const memoizedFibonacci = memoize(fibonacci);

console.log(memoizedFibonacci(10)); // 第一次计算,结果为 55
console.log(memoizedFibonacci(10)); // 直接从缓存中读取,结果为 55

对象实现

除了使用闭包,我们还可以使用对象来实现缓存函数。下面是一个例子:


function memoize(func) {
  const cache = {};
  return {
    get(...args) {
      const key = JSON.stringify(args);
      if (cache[key]) {
        return cache[key];
      }
      const result = func.apply(this, args);
      cache[key] = result;
      return result;
    },
    clear() {
      Object.keys(cache).forEach(key => delete cache[key]);
    }
  };
}

这个函数同样接受一个函数作为参数,并返回一个对象。对象有两个方法:get和clear。get方法用于获取缓存中的结果,clear方法用于清空缓存。

使用这个函数同样可以很方便地将一个普通函数转换为缓存函数。例如:


function factorial(n) {
  if (n <= 1) {
    return 1;
  }
  return n * factorial(n - 1);
}

const memoizedFactorial = memoize(factorial);

console.log(memoizedFactorial.get(5)); // 第一次计算,结果为 120
console.log(memoizedFactorial.get(5)); // 直接从缓存中读取,结果为 120

memoizedFactorial.clear(); // 清空缓存

总结

缓存函数是一种常见的优化技术,可以在函数被多次调用时缓存结果,避免重复计算,从而提高程序的性能。在JavaScript中,我们可以使用闭包和对象来实现缓存函数。无论使用哪种方式,都可以很方便地将一个普通函数转换为缓存函数。