🍎 JavaScript 函数缓存相关
相关问题:
- JavaScript 中如何实现函数缓存?
- JavaScript 函数缓存的应用场景。
# 概念
JavaScript 函数缓存是将函数运算过的结果进行缓存。本质上是用 空间(缓存存储) 换 时间(计算过程)。常用于缓存数据计算结果和缓存对象。
缓存是一个临时的数据存储,保存数据以便将来对数据的请求能够更快地得到处理。
🌰 例子:
const add = (a, b) => a + b
const calc = memoize(add)
calc(10, 20)
calc(10, 20)
1
2
3
4
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
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
2
3
过程分析:
- 在当前函数作用域定义了一个空的独享,用于缓存运行结果;
- 运行柯里化返回一个函数,返回的函数由于闭包的特性,可以访问到
cache
。 - 然后判断输入参数是不是在
cache
中。如果已经存在,直接返回cache
的内容,如果没有存在,使用函数func
对输入参数求值,然后把结果存储在cache
。
# 应用场景
虽然缓存效率很高, 但并不适用所有场景,因此不能极端地将所有函数都添加缓存。
对于以下几种情况可以使用函数缓存:
- 对于昂贵函数调用时,需要执行复杂计算的函数;
- 对于具有有限且高度重复输入范围的函数;
- 对于具有重复输入值的递归函数;
- 对于纯函数,即每次使用特定输入调用时返回相同输出的函数。
# 参考
编辑 (opens new window)
📢 上次更新: 2022/09/02, 10:18:16