执行上下文
JavaScript的执行过程
- 初始化全局对象
JavaScript → AST 阶段:
js引擎会在执行代码之前(编译),会在堆内存中创建一个全局对象:GlobalObject(GO) 该对象 所有的作用域(scope)都可以访问; 里面会包含Date、Array、String、Number、setTimeout、setInterval等等; 其中还有一个window属性指向自己;
- 执行上下文栈(Execution Context Stack ,ECS)
执行的是全局的代码块
- 全局的代码块为了执行会构建一个 Global Execution Context(GEC)
- GEC会 被放入到 ECS 中 执行
GEC被放入到ECS中里面包含两部分内容:
- 第一部分:在代码执行前,在parser转成AST的过程中,会将全局定义的变量、函数等加入到GlobalObject中,但是并不会赋值;这个过程也称之为变量的作用域提升(hoisting)
- **第二部分:**在代码执行中,对变量赋值,或者执行其他的函数;
- 遇到函数该如何执行?
!闭包例外(被引用的AO不会被销毁)
(图 1 源代码顶端缺少代码:var message = "Hello World")
var message = "Hello Global"
function foo(){
console.log(message)
}
function bar(){
var message = "Hello Bar"
foo()
}
bar()
// Hello Global