JS阻塞的问题

 

常见问题
 
 http://www.zhihu.com/question/23101413
 
阻塞特性: 
       JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时作其余任何事情,不管其代码是内嵌的仍是外部的。 
 
一、浏览器解析html时,是否解析到</html>后,dom树构造完成,触发DOMContentLoaded?
   答:Dom load事件不一样的浏览器处理方式不一样,你只须要认为在这个事件激发之后,整个html dom文档就是一个可用的状态,此时documen已经被关闭了,调用document.write会刷白整个页面。
二、通过测试,ie8+,ff,chrome,opera都是下载完html后,接着并行下载css和多个js,即便将script放在页面最后</body>以前也是如此,已经再也不是之前说的js一个一个下载。我想问放在页面最后</body>以前的js,下载期间是否会阻塞页面渲染(应该不是异步的吧)?

  答:下载是异步的没问题,可是每一个javascript执行的时候仍是同步的,就是先出现的script标签必定是先执行,即便是并行下载它最后一个下载完成。除非标有defer的script标签,不然任何javascript在执行的时候都会中断当前html文档解析,天然会阻止页面 渲染。javascript

三、浏览器并行下载js和异步下载js有什么性能上的区别?css

  答:其实没什么性能上的区别,只是异步下载javascript能够尽快的让用户看到页面,比较安心罢了。html

四、在《高性能javascript》中提到,使用JavaScript动态生成script节点,而后将其插入到文档中动态加载js,js加载是异步的,加载和执行不会影响页面渲染!特别不理解,不是说只要执行js就阻塞页面渲染吗?java

  答:javascript加载是不会影响已经渲染的页面,可是会中断html文档解析,浏览器会在javascript执行之后决定当前文档是否须要进行从新渲染或者文档重排。因此即便javascript放到最后面也会使浏览器暂停,但不影响以前已经解析出来的dom文档,此时对于用户来讲是可操做的,而在以前就加载javascript,浏览器会提前暂停,给用户看到的就是白色的页面,不友好。javascript有可能会修改dom,此时修改dom可能比较危险,由于正处于不稳定的状态,若是使用document.write甚至会迫使浏览器强制解析新出现的动态内容,若是是这种状况,javascript执行完成之后就会进行重排。若是javascript修改了css,影响了layout的话,也会进行重渲染或重排。chrome

五、作通常的项目有没有必要使用LABjs,Require.js等加载库?浏览器

  答:项目大了重构起来很方便的,不必在初期就引入复杂性。dom

相关文章
相关标签/搜索