参考答案:
函数缓存,就是将函数运算过的结果进行缓存
本质上就是用空间(缓存存储)换时间(计算过程)
常用于缓存数据计算结果和缓存对象
1const add = (a,b) => a+b; 2const calc = memoize(add); // 函数缓存 3calc(10,20);// 30 4calc(10,20);// 30 缓存
缓存只是一个临时的数据存储,它保存数据,以便将来对该数据的请求能够更快地得到处理
实现函数缓存主要依靠闭包、柯里化、高阶函数,这里再简单复习下:
闭包可以理解成,函数 + 函数体内可访问的变量总和
1(function() { 2 var a = 1; 3 function add() { 4 const b = 2 5 let sum = b + a 6 console.log(sum); // 3 7 } 8 add() 9})()
add
函数本身,以及其内部可访问的变量,即 a = 1
,这两个组合在⼀起就形成了闭包
把接受多个参数的函数转换成接受一个单一参数的函数
1// 非函数柯里化 2var add = function (x,y) { 3 return x+y; 4} 5add(3,4) //7 6 7// 函数柯里化 8var add2 = function (x) { 9 //**返回函数** 10 return function (y) { 11 return x+y; 12 } 13} 14add2(3)(4) //7
将一个二元函数拆分成两个一元函数
通过接收其他函数作为参数或返回其他函数的函数
1function foo(){ 2 var a = 2; 3 4 function bar() { 5 console.log(a); 6 } 7 return bar; 8} 9var baz = foo(); 10baz();//2
函数 foo
如何返回另一个函数 bar
,baz
现在持有对 foo
中定义的bar
函数的引用。由于闭包特性,a
的值能够得到
下面再看看如何实现函数缓存,实现原理也很简单,把参数和对应的结果数据存在一个对象中,调用时判断参数对应的数据是否存在,存在就返回对应的结果数据,否则就返回计算结果
如下所示
1const memoize = function (func, content) { 2 let cache = Object.create(null) 3 content = content || this 4 return (...key) => { 5 if (!cache[key]) { 6 cache[key] = func.apply(content, key) 7 } 8 return cache[key] 9 } 10}
调用方式也很简单
1const calc = memoize(add); 2const num1 = calc(100,200) 3const num2 = calc(100,200) // 缓存得到的结果
过程分析:
cache
cache
的中。如果已经存在,直接返回cache
的内容,如果没有存在,使用函数func
对输入参数求值,然后把结果存储在cache
中虽然使用缓存效率是非常高的,但并不是所有场景都适用,因此千万不要极端的将所有函数都添加缓存
以下几种情况下,适合使用缓存:
最近更新时间:2024-07-22