1.vue的响应式简介 2.闭包的隐蔽泄漏点

76 阅读2分钟

什么事vue的数据响应式:数据变化后,依赖该数据的函数重新运行(并不是只和视图相关)

什么是依赖收集:将数据和被监听的函数关联起来

什么是派发更新:重运行依赖关系中的函数

+-------------+         +----------------+          +------------------+       +--------------+
|   数据(Data)|  ---->  |  依赖收集(Dep)   |  ---->  |   观察者(Watcher)  |  ----> |   更新视图   
+-------------+         +----------------+          +------------------+       +--------------+
                   ↖                                                 ↑
                    \_______  依赖收集关联  ________/

在这个示意图中:

-   数据(Data)变化会触发相应的依赖收集(Dep)。
-   依赖收集(Dep)将 Watcher 添加到其依赖列表中,并建立了数据与 Watcher 的关联。
-   当数据被访问时,Watcher 会被添加到对应的依赖收集(Dep)中。
-   当数据发生变化时,依赖收集(Dep)会通知相关的 Watcher 执行更新。
-   Watcher 执行更新时,会触发相应的视图更新。

这样的设计使得 Vue 能够实现响应式的数据绑定,从而让数据变化能够自动地反映到视图中,提供了一种便捷的方式来管理和维护用户界面。

先用一个例子:

function a(){
    let g1 = '';
    let g2 = 很大的数值(占很多内存)
    function b(){
        
    }
    function c(){
        console.log(g2)
    }
    return c
}

let d = a()
d = null

由于 d(就是b函数的引用)其实他也由于是a函数的内部,所以他已虽然没有使用a的作用域中的属性,但是依然作为b函数的词法作用域,只不过他是空的。同理c函数也是和b函数同一个词法作用域,并且🚰了a函数的属性g2,所以导致了他们公共的词法作用域扩张了。所以最后d所占据的内存不可触达,但是b依然存在,所以词法作用域并没有销毁,并且还存着🚰着g2,占据着大量的内存空间,所以会导致内存泄漏。