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组件data函数的具体使用

    Vue组件data函数的具体使用

    在Vue组件中,data函数用于定义组件的数据,本文主要介绍了Vue组件data函数的具体使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • 基于Vue.js 2.0实现百度搜索框效果

    基于Vue.js 2.0实现百度搜索框效果

    这篇文章主要为大家详细介绍了基于Vue.js 2.0实现百度搜索框效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • vue中Vue.set()的使用以及对其进行深入解析

    vue中Vue.set()的使用以及对其进行深入解析

    vue不允许在已经创建的实例上动态添加新的根级响应式属性,不过可以使用Vue.set()方法将响应式属性添加到嵌套的对象上,下面这篇文章主要给大家介绍了关于vue中Vue.set()的使用以及对其进行深入解析的相关资料,需要的朋友可以参考下
    2023-01-01
  • Vue自定义组件双向绑定实现原理及方法详解

    Vue自定义组件双向绑定实现原理及方法详解

    这篇文章主要介绍了Vue自定义组件双向绑定实现原理及方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • vue实现菜单权限控制的示例代码

    vue实现菜单权限控制的示例代码

    这篇文章主要介绍了vue实现菜单权限控制的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • iview同时验证多个表单问题总结

    iview同时验证多个表单问题总结

    这篇文章主要介绍了iview同时验证多个表单问题总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))

    Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))

    今天小编就为大家分享一篇Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML)),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • vue使用websocket连接优化性能方式

    vue使用websocket连接优化性能方式

    这篇文章主要介绍了vue使用websocket连接优化性能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue2 添加数据可视化支持的方法步骤

    Vue2 添加数据可视化支持的方法步骤

    这篇文章主要介绍了Vue2 添加数据可视化支持的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • vue菜单栏联动内容页面tab的实现示例

    vue菜单栏联动内容页面tab的实现示例

    本文主要介绍了vue菜单栏联动内容页面tab的实现示例,左侧菜单栏与右侧内容部分联动,当点击左侧的菜单,右侧会展示对应的tab,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论