在浏览器加载HTML文件的时候,遇到js标签,会停止解析HTML,去加载和执行javascript代码
javascript代码的执行需要依靠V8引擎
javascript代码属于高级语言,计算机只能识别机器语言(010100),或者说计算机的CPU只能执行指令
V8引擎解析javascript的过程V8引擎的定义:
V8引擎是C++编写的Google开源高性能javascript和webAssembly引擎,它用于Chrome和Node.js等等
V8可以单独运行,也可以嵌入到c++应用程序中
javascript代码被解析的详细过程(parse):
Blink将源码交给V8引擎,Stream获取到源码并且进行编码转化
Scanner进行词法分析,词法分析会将代码转换成tokens
接下来tokens会被转换成AST树,经过Parser和PreParser(预编译)
Parser就是直接将token转换成AST树架构
PreParser预编译理解
并不是一开始对所有javascript代码进行编译,在一开始就执行。如果直接对所有javascript代码进行解析,会影响网页运行效率
V8引擎实现了Lazy Parsing(延迟解析)方案,将不必要的函数进行预解析,就是只解析当时需要的内容,而对于函数的全量解析是在函数调用时候进行
4.生成AST树后,会被Ignition转换成字节码,之后就是代码执行过程
代码执行过程 1、代码准备过程代码被解析,V8引擎内部会帮助我们创建一个GO对象(Global Object),var globalobject={
String:’’,
Math:’’,//等js的内置属性
age:undefined,
…
//自己定义的变量
}
运行代码:
1.v8为了执行代码,v8引擎内部会有一个执行上下文栈(调用栈)(Execution Context Stock),简称ECStock
2.为了执行全局代码的正常执行,需要创建全局执行上下文(Global Execution Context)
var tt='ttt' function foo(){ console.log(tt) var gg='gg' var mm='mm' } var oo='oo'
编译过程(只分析变量):
函数解析过程生成了AO对象,在ECStock里边生成了自己的函数执行上下文FEC(Function)
执行的过程 给每个变量赋值
函数执行,通过作用域链找到要赋值的变量
常见面试题型,变量作用域提升…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)