赞
踩
当我们输入一个域名时会经历dns解析变成一个ip地址,然后浏览器会通过这个ip地址去访问服务器,服务器会放回一个index.html页面,浏览器开始解析这个inde.html文件,当解析到link标签时就开始下载对应的css文件,遇见script标签就开始下载对应的js文件。
浏览器对各种html、css、js文件的解析都需要通过浏览器内核来完成,它是持浏览器运行的最核心的程序,分为两个部分的,一是渲染引擎,另一个是JS引擎。渲染引擎在不同的浏览器中也不是都相同的。下面是一些主流浏览器内核:
浏览器在渲染一个网页时会先收到一个服务器返回的index.html
文件,然后浏览器通过渲染引擎和JS引擎对整个index.html
进行解析,HTML
标签会被HTML Paeser
解析成DOM Tree
(DOM树),在生成DOM树的过程中会有一些JS代码来对DOM进行操作,这些JS代码由JS引擎解析执行(后面会对JS引擎做介绍),CSS
文件会被CSS Parser
解析成style Rules
(样式规则),DOM Tree
和style Rules
通过Attachment
附加到一起,再结合Layout
(布局引擎)进行布局(虽然前面已经将DOM树和样式结合形成了渲染树,但随着浏览器所处的状态不同,布局也会随之改变,所以需要通过Layout布局引擎布局),这会生成一个Render Tree
,然后就可以开始绘制(Painting),最后进行展示(Display)。
V8引擎解析和运行JS代码流程:
V8引擎会先对Js源代码做一个解析(Parse),分为词法分析和语法分析,解析完之后会生成一个抽象语法树(AST),AST 通过V8的一个库 Ignition转换为字节码,之所以转换成字节码而不是机器码,是因为在不同的环境中cpu的指令集是不同的,就像Java通过JVM实现跨平台一样,这里的字节码也起到了类似的作用,字节码不依赖于平台,它在任何平台都可以运行。当需要运行时V8引擎会将字节码转译成对应系统的机器码运行,相交于直接将AST运行转译为对应的机器码,这样的效率高很多。但是每一次运行都需要通过字节码编译一遍,在面对高频使用的的一些函数、变量、类等js代码时,相同的字节码编译多次非常浪费性能。V8引擎有一个TurboFan库,它可以通过Ignition库分析可能高频率使用的一些变量、函数等代码,给他们打上一个hot标记,这些被打上hot标记的函数、变量等代码会被TurboFan转换为优化的机械码,等到后面调用时就直接运行被优化的机械码,不需要在去编译字节码。 如果被优化编译的函数、变量等出现了某些改变需要重新编译,那么对应的机械码会反向优化(Deoptimization)转回字节码,再由字节码文件完成编译运行。
总结: 在学习函数执行与作用域链之前先要了解一个底层概念:代码执行是先从磁盘加载到内存中,然后代码内存中被转换成机器指令,最后交给cpu执行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。