、
什么事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,占据着大量的内存空间,所以会导致内存泄漏。