JS浏览器基础

266 阅读3分钟

浏览器基础

编程语言发展过程

机器语言:用0100011...的二进制串作为指令,计算机直接识别
汇编语言:用mov,ax,bx等简单的英文作为指令,转成机器语言被计算机识别
高级语言:C C++ Java JavaScript Python,转成机器语言被计算机识别
高级语言又分编译型语言和解释型语言:编译型先转变成可执行的文件再由编译器翻译最后被执行;解释型边解释边执行。

浏览器原理

地址栏输入域名,经过DNS服务器解析成IP地址,这个IP地址就是一个服务器地址,服务器存放静态资源,访问后会返回一个HTML文件,然后本地浏览器开始解析Html文件,遇到link标签就去服务器中下载CSS资源,遇到SCRIPT标签就去服务器中下载js资源,再被浏览器解析,解析的过程由浏览器内核完成。

浏览器原理.jpg

浏览器内核

浏览器内核也称作浏览器的排版引擎、页面渲染引擎、浏览器引擎等。
不同的浏览器有不同的引擎:safari用webkit(由苹果开发);chrome用blink(是webkit的分支,由Google开发)。

渲染过程

各类资源都下载后开始渲染,浏览器内核中有HTMLparser和CSSparser,分别将HTML解析成dom树,将css解析成css规则,将它俩附加到一起形成渲染树,通过layout布局引擎生成最终的渲染树(layout在这里解决页面不同大小时布局的兼容问题)再进行绘制展示出来。另外JS可以操作DOM,由JS引擎来执行。

渲染过程.jpg

JS引擎

为什么需要JS引擎

所有的高级语言最终都要被转化成机器指令来执行,js代码无论在浏览器还是NODE中执行,最终都要被CPU执行,所以需要JS引擎将JS代码翻译成CPU指令。

常见的JS引擎

chakra:微软开发,用于IE。
JavaScriptCore:webkit的引擎,苹果公司开发。
V8:chrome中的引擎,google开发。

JS引擎与浏览器内核的关系

浏览器内核包含JS引擎:例如webkit中webcore负责HTML解析、布局、渲染等相关工作,JavaScriptCore负责解析执行js代码。

V8引擎

定义

V8用C++编写的高性能JavaScript和WebAssembly引擎,用于chrome和node.js。(可以独立运行,也可以嵌入到任何C++应用程序中,所以可以应用于node中。)

原理

V8原理.jpg

特点

延迟解析(lazy parsing):将不必要的函数进行预解析,暂时解析需要的内容当函数被调用时解析全部以此增强效率。(预解析是在解析模块上增加的一个模块)

JS代码在V8引擎中的执行过程

js文件的执行方式

在Html文件中body中用script标签引入,浏览器运行。 使用终端在node中运行。

执行具体过程

根据V8原理图,代码到运行分四个阶段:1.js源代码 2.AST树 3.字节码文件 4.运行。
1.解析代码(阶段1-2),V8引擎会创建一个全局对象globalObject,GO(包含浏览器提供的各种全局对象和js代码里的属性)。

GO.png 2.运行代码(阶段2-4)
2.1 V8引擎会创建一个执行上下文栈ExecutionContextStuck,ECStuck(函数调用栈,属于内存,内存被划分为栈结构和堆结构)所有的函数都要放入这个栈结构去执行。
2.2 因为我们执行的是全局代码,为了全局代码的正常执行,需要创建全局执行上下文GlobalExecutionContext,GEC(全局代码需要被执行时才会创建),GEC中有VO变量对象指向GO,执行代码从上到下,执行时将值赋给GO中的变量,再次调用就可以直接得出变量的值。

执行过程.png