1.响应式实现主要通过Proxy代理对象的赋值和读取,在赋值和读取时执行副作用函数,达到响应的效果。
2.出于在进行赋值读取时,需要特定的属性与特定的副作用函数存在联系,最终可以考虑采用树形结构,来对副作用函数进行存储,结构为target(WeakMap)-key(Map)-EffectFun(Set)。
3. 遗留的副作用函数的解决方法是在该副作用函数运行前,清除所有拥有该副作用函数的Set里的该函数,而记录所有拥有该副作用函数的办法就是在构建该树形时收集到数组中。
4.调用forEach遍历Set集合时,如果先删除一个值后又增加回来会导致无限循环,最好构造另一个Set包装它,这样修改是在原来的Set上修改,而遍历在外层Set上。
5.由于组件之间可以进行嵌套,而渲染函数本身也是副作用函数,所以副作用函数需要能嵌套,在进行嵌套时,我们还需要使用副作用函数栈来保证嵌套执行顺序正确。
6.无限循环递归导致的爆栈,对于obj.foo++来说,同时进行两个副作用函数,出现无限递归,可通过判断当前正执行的副作用函数与触发的副作用函数是否相同,相同则不执行。
7.effect副作用注册函数的第二个参数对象中可以配置Schduler调度器和options等。
8.为了实现computed,就是在effect副作用注册函数上使用Lazy的方式延迟执行(通过保存函数并返回),以及使用dirty和value等方式进行结果缓存,最后再通过手动分别在obj的get属性和Scheduler中手动使用track和trigger函数实现响应效果。
9.watch函数的实现,第一个参数是通过对观测对象的每个值进行递归遍历读取的回调函数,该回调函数相当于getter,而第二个参数Scheduler相当于setter,用于执行响应回调函数,实现新旧值获得的功能就使用lazy的effect,然后先手动执行一次作为旧值,在Scheduler中就可以获得新值,因为scheduler是变化发生时触发的函数,第三个参数过期回调其实就是在两次变化之间执行该回调函数。
今日算法题:设计链表
注意构造函数中可以放变量,这里放tail和head,以及size,同时可以将找节点单独定义成一个函数,其它的注意边界即可,找一个切入点后,围绕着切入点和目标写代码。