1.定义

函数记忆是指将上次的结果缓存起来,当下次调用时,如果遇到相同的参数,直接返回缓存中的数据,本质上利用了闭包的原理,在内部构建了一个cache缓存对象。

2.实现

  1. //实现
  2. function memorize(fn,hasher) {
  3. var cache = {}
  4. return function(key) {
  5. let address = '' + (hasher? hasher.apply(this,arguments) : key)
  6. if(!cache[address]) {
  7. cache[address] = fn.apply(this,arguments)
  8. }
  9. return cache[address]
  10. }
  11. }
  12. //调用
  13. var count = 0;
  14. var fibonacci = function(n){
  15. count++;
  16. return n < 2? n : fibonacci(n-1) + fibonacci(n-2);
  17. };
  18. fibonacci = memorize(fibonacci)
  19. for (var i = 0; i <= 10; i++){
  20. fibonacci(i)
  21. }
  22. console.log(count)

3.适用场景

函数记忆只是一种编程技巧,本质上是牺牲算法的空间复杂度以换取更优的时间复杂度,在客户端 JavaScript 中代码的执行时间复杂度往往成为瓶颈,因此在大多数场景下,这种牺牲空间换取时间的做法以提升程序执行效率的做法是非常可取的。一般在需要大量重复的计算,或者大量计算又依赖于之前的结果,便可以考虑使用函数记忆