文章目录

离春节的日子越来越近,还有10天就可以回家了。今天没有做什么业务上的事情,自己温习了下JavaScript的一些高级教程。

  1. 内存管理

    1. 堆: 存储对象,更确切的说是数据大小可变的数据类型,它们的值存储的是指向内存中对象地址。属于二级缓存区域(由垃圾回收算法回收内存)
    2. 栈: 动态内存区域,存储基本数据类型。JS不像C类语言,它对字符串做了处理,并将其归入基本数据类型。它们的值直接存储在变量的访问位置。属于一级缓存区域
    3. 消息队列:负责JS主线程与其他进程(主要是各种I/O操作)的通信的线程是消息线程,这意味着在I/O操作中,谁先有结果返回,可以在JS函数调用栈为空时,优先得到JS调用栈的处理。队列这种结构就是先进先出的典型。当栈再次为空的时候,就意味着消息队列的结束。
    4. 添加消息: 常用的setTimeout(fn,0)在消息队列的尾部添加事件回调函数
  2. 看了下reactJS虚拟Dom的部分源码。

    1. 不得不说自己真还没有这个水平完全写一个类似React的MVVM框架出来,还有很长的路要走哩。主要的技术难点分析下来,在于这几点

      1.  Model + view:建立合适的数据模型描述Dom结构。这一点reactJS的主要做法就是添加路标系统---data-reactid,通过使用reactid标示每一个dom节点,可以让View和Model建立很好地映射关系。
      
      1. VM + 处理事件:在前端的世界里,几乎天天离不开处理各种事件。在view层产生各种事件,如click等的时候,我们如何检测事件发生的dom节点。比较常规的做法是,将所有的事件都挂载在document上,通过冒泡的形式,获取e.target.getAttribute(‘data-reactid’)来遍历Model寻找需要更改的数据范围。这种常规的思想缺点在于,遍历是个比较费性能的事,而且处理回调函数需要考虑到各种情况,对Model设计是个大考验。而React的思路比较好,它把所有的data-reactid和Model综合起来,构建了和DOM 完全映射的VM (virtual dom),在处理事情的时候也采用事件代理+hash表的形式。这个我只是大概有个思路,具体实现,还不是特别清楚,需要继续研习。
      2. DOM diff算法:这个是个大头,也是React的核心所在,这个算法需要考虑的几个大头问题是:

        1.  映射关系以data-reactid为准的情况下,以什么样的尺度比较两次Model的不同,是浅对比还是深对比。
        
        1. 选定比对尺度后,对页面的真实DOM是reorder,reorganize 还是destroy,create等等
        2. 对于用户没有通过react进行的操作,如何在Model更新的时候依旧保留
          夜深了,发现写个日记确实能够帮助巩固很多知识呢! anyway,night

 

文章目录