响应式数据原理
函数副作用
什么是函数副作用?
函数副作用是指当调用函数时,除了返回函数值之外,还对函数以外产生了附加的影响,JS 中能产生副作用的函数很多,例如下面的函数修改了全局变量,就是一个具有副作用的函数了。
javascript
// 全局变量
let foo = 1;
function effect() {
foo = 2;
}
// 全局变量
let foo = 1;
function effect() {
foo = 2;
}
如何利用函数副作用实现响应式数据
响应式数据就是在数据修改后,例如页面中渲染的该数据也会自动更新,那么如果能在修改数据的时候,能自动执行使用了该数据的副作用函数,那么就实现了响应式数据。
那么如何在修改数据的时候,自动执行副作用函数呢?
有两种方法可以拦截修改数据的操作,一是
defineProperty
,一是Proxy
,随着浏览器技术的发展,目前的主流浏览器最新版本都已支持 Proxy,所以Vue 3
使用了Proxy
实现了响应式数据。
简单示例:
而在一个完整的网页或者系统中,一个数据很可能会有很多处使用,那么我们就应该是把这些副作用的函数搜集起来统一处理
那我们在读取数据的时候将副作用函数放到一个 Set 中,(为了避免同一个函数重复加入因此使用 Set),在修改数据的时候将副作用函数从 Set 中取出并执行。