具体看一下一段代码的执行流程:
function foo() {
var name = 'foo'
console.log(name);
}
var num1 = 20
var num2 = 30
var result = num1 + num2
console.log(result);
foo()
-
在将JavaScript源代码parse成为AST抽象语法树时,V8引擎内部会创建一个全局对象Global Object(GO),该对象包含Array,Date,Number等类,另外还包含一个window属性指向GO自己
image.png - 定义的全局变量或函数,也会在解析(编译阶段)的时候加入全局对象GO,但是由于这个时候只是解析,代码并没有真正的执行因此并不会被赋值
image.png - 解析完成后生成了AST,AST经过Ignition生成字节码,然后代码开始运行
- 在V8中,其内部维护着一个执行上下文Execution Context Stack,简称ECS(函数调用栈),所有的代码在执行的时候都需要放入ECS中。
- 执行全局代码快的时候,会创建一个全局执行上下文Execution Context Stack,简称ECS,压入执行栈中。
GEC包含两个部分第一部分:在代码执行前,在parser转成AST的过程中,会将全局定义的变量、函数等加入到GlobalObject中,
但是并不会赋值;这个过程也称之为变量的作用域提升(hoisting)
第二部分:在代码执行中,对变量赋值,或者执行其他的函数;
网友评论