目录

🍎 JavaScript 函数缓存相关

相关问题:

  • JavaScript 中如何实现函数缓存?
  • JavaScript 函数缓存的应用场景。

# 概念

JavaScript 函数缓存是将函数运算过的结果进行缓存。本质上是用 空间(缓存存储) 换 时间(计算过程)。常用于缓存数据计算结果和缓存对象。

缓存是一个临时的数据存储,保存数据以便将来对数据的请求能够更快地得到处理。

🌰 例子:

const add = (a, b) => a + b
const calc = memoize(add)
calc(10, 20)
calc(10, 20) 
1
2
3
4

# 如何实现

实现函数缓存主要依靠 闭包、柯里化、高阶函数。

实现原理,把参数和对应的结果保存在一个对象中,调用时判断参数对应的数据是否存在,存在就返回对应的结果护具,否则就返回计算结果。

🌰 例子:

const memoize = function(func, content) {
  let cache = Object.create(null)
  content = content || this
  return (...key) => {
    if(!cache[key]) {
      cache[key] = func.apply(content, key)
    }
    return cache[key]
  }
}
1
2
3
4
5
6
7
8
9
10

调用方式:

const calc = memoize(add)
const num1 = calc(100, 200)
const num2 = calc(100, 200)
1
2
3

过程分析:

  • 在当前函数作用域定义了一个空的独享,用于缓存运行结果;
  • 运行柯里化返回一个函数,返回的函数由于闭包的特性,可以访问到 cache
  • 然后判断输入参数是不是在 cache 中。如果已经存在,直接返回 cache 的内容,如果没有存在,使用函数 func 对输入参数求值,然后把结果存储在 cache

# 应用场景

虽然缓存效率很高, 但并不适用所有场景,因此不能极端地将所有函数都添加缓存。

对于以下几种情况可以使用函数缓存:

  • 对于昂贵函数调用时,需要执行复杂计算的函数;
  • 对于具有有限且高度重复输入范围的函数;
  • 对于具有重复输入值的递归函数;
  • 对于纯函数,即每次使用特定输入调用时返回相同输出的函数。

# 参考

📢 上次更新: 2022/09/02, 10:18:16