利用闭包的特点来实现一个简单的缓存

备忘模式就是应用闭包的特点的一个典型应用。比如下面函数:

当多次执行 add() 时,每次得到的结果都是重新计算得到的,如果是开销很大的计算操作的话就比较消耗性能了。这里可以对已经计算过的输入做一个缓存。

javascript 复制代码
        function add(a) {
            return a+1;
        }

所以这里可以利用闭包的特点来实现一个简单的缓存,在函数内部用一个对象存储输入的参数,如果下次再输入相同的参数,那就比较一下对象的属性。如果有缓存,就直接把值从这个对象里面取出来。

实现代码如下:

备忘函数中用 JSON.stringify 把传给 adder 函数的参数序列化成字符串,把它当做 cache 的索引,将 add 函数运行的结果当做索引的值传递给 cache。

这样 adder 运行的时候如果传递的参数之前传递过,那么就返回缓存好的计算结果,不用再计算了,如果传递的参数没计算过,则计算并缓存 fn.apply(fn, args),再返回计算的结果。

javascript 复制代码
      function memorize(fn) {
        let cache = {};
        return function(...args) {
            let key = JSON.stringify(args)
            if (!(key in cache)) {
                console.log('需要计算')
                cache[key] = fn.apply(fn, args)
            }
            return cache[key]
        }
      }

      function add(a) {
        return a + 1
      }

      var adder = memorize(add)
      console.log(adder(1)); // 2
      console.log(adder(1)); // 2
      console.log(adder(2)); // 3
      console.log(adder(3)); // 4
      console.log(adder(1)); // 2
相关推荐
思码梁田8 分钟前
CSS 浏览器厂商前缀:从「写 5 遍」到现代自动化兼容
前端·css·css3·border-radius·1024程序员节·box-shadow·厂商前缀
Bug收容所13 分钟前
Vue+JS Day3
前端·javascript·vue.js·前端框架·1024程序员节
李纲明14 分钟前
WordPress 挂上 Cloudflare 后询盘和后台异常:缓存规则、SSL 模式和真实 IP 怎么核
运维·缓存·https·cdn·wordpress·cloudflare
iCxhust28 分钟前
如何实时同步自己的工作日志,在不同的设备间
前端·软件工程·1024程序员节·同步日志
IT_陈寒43 分钟前
React项目实战经验分享:如何避免useEffect闭包陷阱导致的陈旧状态问题?
前端·人工智能·后端
风骏时光牛马1 小时前
智能任务调度Agent
前端
ljt27249606611 小时前
Vue笔记(十六)--自定义Hook
前端·1024程序员节
沙蒿同学10 小时前
不引 Ghostscript:我用纯 Go 给 PDF 做了一场「压缩手术」
前端·后端·github
变与不变80610 小时前
jQuery细节以及使用应用场景
前端·javascript·jquery
SailingCoder12 小时前
【封闭结束1】端到端交付:Agent 一次请求如何走完全链路
前端·安全·ai·面试·agent·harness