Vue源码cached解析

 更新时间:2022年08月13日 08:55:53   作者:qq_22841387  
最近在写闭包的应用的时候,出现了一个cached函数,来源于Vue源码,利用了闭包变量不会被回收的特点,可以缓存变量,cached本质上是一个高阶函数,它接受一个函数的参数,同时返回一个函数

前言

创建一个纯函数的缓存版本

主要用途:优化性能——对于之前运算过一次的内容,利用闭包原理,缓存起来,避免重复调用,造成性能的浪费

  /**
   * Create a cached version of a pure function.
   */
  function cached (fn) {
    var cache = Object.create(null);
    return (function cachedFn (str) {
      var hit = cache[str];
      return hit || (cache[str] = fn(str))
    })
  }

这一段的源码很短,但是在源码中使用了19处!这就显得这个函数很重要了

参数解释

传入参数

fn:(函数类型)

用于执行需要缓存的方法

str:字符串类型

传入函数fn中的参数

返回参数

类型为:函数类型

源码解释

首先通过Object.create创建一个干净的空对象出来

然后直接返回一个函数(cachedFn

函数内首先定义变量,通过传入的参数str去访问创建出来的cache对象

  • 若hit击中了目标,即不为undefined——直接返回,不再调用函数
  • 若未击中,则访问传入的fn函数,并把函数返回值赋值给cache对象

实验解释

这样可能比较抽象,我们直接做一个实验,同样直接在浏览器中做

这一次,我们直接在浏览器的源代码中做——debug

function cached(fn) {
    var cache = Object.create(null)
    return(
        function cachedFn(str) {
            var hit = cache[str];
            return hit || (cache[str] = fn(str));
        }
    )
}
var capitalize = cached(function(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
})
console.log(capitalize("abc"),"第一次访问")
console.log(capitalize("abc"),"第二次访问")

直接打一个断点,看看会发生什么

执行第一次

在第一次运行时,发现cache是一个空的object,然后直接进入了立即执行函数cacheFn

这里立即执行函数的作用就是

创建新的作用域,隔离变量——于将var使用变为let效果一致

str值为abc,也就是传入参数fn中的参数

下一步执行,当然就是执行fn函数了

我们可以看到这里的fn函数就是对应capitalize中的function,将str的参数传进来

执行的结果就是Abc

右边执行完成后,赋值给左侧的cache[str]

这里的代码可以翻译成,或许更好理解

cache[str] = "Abc"

也就是说,这里相当于通过方括号属性访问器,创建了一个不存在的属性abc,对应的值是fn返回的Abc

在右侧监视的cache也明显的多出了一个属性abc

执行第二次

此时我们看见,cache此时是具有属性abc的,因此hit的值不再是undefined

第二次时,很明显的我们可以看见执行过程,没有再次调用fn函数,也就是说没有调用capitalize中的函数,而是直接获取的缓存。

从而也就做到了对性能的优化。

源码疑问

为什么cache是有效的,每次调用函数的时候不都创建了新的吗?

这里其实使用的是闭包的特性。

在调用cached函数时,会在当前函数创建一个cache对象

也就是说,其实cache对象是属于当前示例中的capitalize

这个我们可以直接在属性中看出来

我们重新debug一次,这一次关注capitalize中的值

第一次执行时

第二次执行时

在运行完cache[str] = fn(str)后,发现的确这里的值增加了一个

因此,我们可以得出结论。

小结:

在每一次调用cached时,由于闭包函数的特性,使得cached中的变量值不会被清空,而且这个值是在对应的处理方法中的。

因为cache对象是在内部创建的,所以每次调用cached都将是不同的object

各自拥有独立的缓存空间,而不是全局共用一个

到此这篇关于Vue源码cached解析的文章就介绍到这了,更多相关Vue cached内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue仿ios列表左划删除

    vue仿ios列表左划删除

    这篇文章主要为大家详细介绍了vue仿ios列表左划删除,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作

    vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作

    这篇文章主要介绍了vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • express+vue+mongodb+session 实现注册登录功能

    express+vue+mongodb+session 实现注册登录功能

    这篇文章主要介绍了express+vue+mongodb+session 实现注册登录,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • vue+element加入签名效果(移动端可用)

    vue+element加入签名效果(移动端可用)

    这篇文章主要介绍了vue+element加入签名效果(移动端),本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • vue实现下载文件流完整前后端代码

    vue实现下载文件流完整前后端代码

    这篇文章主要为大家详细介绍了vue实现下载文件流完整前后端代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • vue中改变滚动条样式的方法

    vue中改变滚动条样式的方法

    这篇文章主要介绍了vue中改变滚动条样式的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Vue渲染流程步骤详解

    Vue渲染流程步骤详解

    在Vue里渲染一块内容,会有四个流程步骤,那么该怎么理解这个流程呢,所以本文就给大家详细讲解一下Vue 渲染流程,文中有纤细的代码示例供大家参考,需要的朋友可以参考下
    2023-07-07
  • Vue实现Excel预览功能使用场景示例详解

    Vue实现Excel预览功能使用场景示例详解

    这篇文章主要为大家介绍了Vue实现Excel预览功能使用场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • vue路由前进后退动画效果的实现代码

    vue路由前进后退动画效果的实现代码

    这篇文章主要介绍了vue路由前进后退动画效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • vue 判断元素内容是否超过宽度的方式

    vue 判断元素内容是否超过宽度的方式

    这篇文章主要介绍了vue 判断元素内容是否超过宽度的方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07

最新评论