JavaScript时间线

js时间线

js执行是单线程,并非说整个浏览器都是单线程的,姑且就成为单线程吧css

js单线程的缘由是为了不多线程操做dom,引起的并发问题,dom属于基础数据,从多线程上讲,对它的操做要加事物,而js的操做最初就是为了操做dom,嗯,幸亏是单线程的,总之一句话,凡是可以修改dom的必定得同步web


客户端js时间线

一、建立document对象,开始解析web页面。建立HTMLHtmlElement对象,添加到document中。这个阶段document.readyState = 'loading'。
二、遇到link外部css,建立线程加载,并继续解析文档。并发
三、遇到script外部js,而且没有设置async、defer,浏览器建立线程加载,并阻塞,等待js加载完成并执行该脚本,而后继续解析文档。js拥有修改dom的能力-->domcument.write
四、遇到script外部js,而且设置有async、defter,浏览器建立线程加载,并继续解析文档。浏览器

async属性的脚本,脚本加载完成后当即执行。 defter==丢置尾部。
document.createElement('script')的方式动态插入script元素来模拟async属性,实现脚本异步加载和执行。网络

五、遇到img等,浏览器建立线程加载,并继续解析文档。并发
六、当文档解析完成,document.readyState = 'interactive'。
七、文档解析完成后,全部设置有defer的脚本会按照顺序执行。(注意与async的不一样)
八、document对象触发DOMContentLoaded事件,这也标志着程序执行从同步脚本执行阶段,转化为事件驱动阶段。
九、当全部async的脚本加载完成并执行后、img等加载完成后,document.readyState = 'complete',window对象触发load事件。
十、今后,以异步响应方式处理用户输入、网络事件等。多线程

相关文章
相关标签/搜索