javascript中的函数缓存
一、什么是函数缓存
函数缓存就是将函数运算过的结果进行缓存,本质上是用空间(缓存储存)换时间,常用于缓存数据计算结果和缓存对象。
const add = (a,b) => a+b;
const calc = memoize(add); // 函数缓存
calc(10,20);// 30
calc(10,20);// 30 缓存
缓存只是一个临时的数据存储,它能保存数据,以便将来对该数据的请求能够被更快得处理。
二、怎么实现
主要依靠闭包、柯里化、高阶函数处理。
将参数和对应的结果数据存在一个对象中,调用时判断参数对应的数据是否存在,存在就返回对应的结果数据,否则就返回计算结果。
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]
}
}
// 调用
const calc = memoize(add);
const num1 = calc(100,200)
const num2 = calc(100,200) // 缓存得到得结果
过程:
- 在当前函数的作用域中定义一个空对象,用于缓存运行结果
- 柯里化一个返回函数,由于闭包特性,这个函数可以访问到cache
- 判读输入的函数是否存在于cache中,如果已经存在,则直接返回cache中的对应的内容,如果没有,则将参数输入函数func得到运算结果,将结果存在cache中,再返回cache中的对应内容。
三、使用场景
使用缓存会使得效率得到很大的提高,适合使用缓存的情况有:
- 昂贵的函数调用,执行复杂计算的函数
- 具有有限且高度重复输入范围的函数
- 具有重复输入值的递归函数
- 纯函数,即每次使用特定输入调用时返回相同输出的函数