语言特点
-
JavaScript是一门高级语言
-
高级语言
-
编译型——将高级语言编写的文件转化为可执行文件后直接执行
-
解释型——机器逐行执行高级语言编写的文件
-
浏览器工作原理【从下载到渲染】
-
浏览器内核——解析从服务器下载的html、css、js文件
-
浏览器排版引擎——通常所说的浏览器内核,负责渲染页面
-
排版引擎:也称为浏览器引擎、页面排版引擎、排版引擎
-
-
HTML Parser、CSS Parser:解析html和css
-
三角DOM:表示HTML Parser生成的DOM树可通过JavaScript修改,解析JavaScript使用的是js引擎(浏览器排版引擎)
-
浏览器排版引擎首先解析HTML和css文件,生成每个元素的样式后再进行布局,然后渲染【个人理解:首先生成背景色、字体颜色等样式,而后解析display、float等布局样式】
-
-
JavaScript引擎
-
无论JavaScript在浏览器还是node环境下执行,都需要将其转化为CPU可执行的机器语言,所以需要JavaScript引擎对JavaScript代码进行转化
-
浏览器引擎和JavaScript引擎的关系
-
也就是说c++开发的应用程序可以使用JavaScript进行功能扩展
-
v8引擎执行原理
-
AST语法树——源代码的抽象语法结构的表示,通常是编译过程的第一步
-
实现ast语法树有利于语言结构的转化,如es9语法的JavaScript代码转化为es5语法的代码,typescript代码转化为JavaScript代码
-
-
Ignition库——将ast语法树转化为字节码
-
转化为字节码的原因:
-
每个操作系统执行的字节码是不同的,所以不能直接将JavaScript代码转化为字节码,需要通过Ignition库进行转化
-
-
-
预解析
-
Lasy Parsing(延迟解析):不必要立刻执行的函数进行预解析,只解析立刻执行的代码,直到函数需要执行的时候才进行解析
-
-
解析的过程只进行变量、函数声明,不进行赋值和函数执行
v8引擎执行过程
-
代码解析,生成AST树,创建全局对象global object(GO),将变量创建在GO中,不赋值【作用域提升】
-
代码运行
-
v8为了执行代码,内部会生成上下文调用栈(Execution Context Stack ECStack)(函数调用栈)
-
为了执行全局代码,v8引擎会创建 全局执行上下文,类似全局函数
-
全局函数有VO(variable object)对象,全局函数的VO对象执行GO
-
普通函数也有对应的VO对象,但不指向GO
-
-