这块内容比较晦涩,简单的来理解一下,做个记录,有机会深入研究。
执行上下文
执行上下文(Execution Context,简称EC)在JavaScript中式一个非常重要的概念,我们可以简单的将其理解为JavaScript的运行环境,根据环境的不同,我们把执行上下文又可以分为三类:
- 全局执行上下文
- 函数执行上下文
- eval执行上下文
他们有这样的特性: - 全局执行上下文只有一个,但是函数执行上下文可以有很多个
- 单线程,从上往下同步执行
- 函数每被调用一次就会生成一个执行上下文环境
执行上下文栈
我们这样来看执行上下文栈:
1.在代码执行执行前,会先创建一个栈来管理和储存所有的执行上下文对象。
2.全局执行上下文首先会被确定,然后被添加到这个栈中(入栈)
3.当一个函数上下文确定之后,他也会被添加到这个栈中,并且他会被放在全局执行上下文的上面(入栈)
4.当第二个函数上下文确定的时候,他也会被放到栈中,且放到最上方,后面的一样。(入栈)
5.当一个函数上下文执行完成,我们会将其移除出栈,这个时候他必定存在于栈顶。(出栈,销毁)
6.当所有的函数上下文都执行完成,栈中还剩下一个执行上下文,就是全局执行上下文。
7.当浏览器关闭时,全局上下文被移除出栈。(出栈,销毁)
执行上下文的生命周期
从上面的流程我们可以看到,执行上下文其实分成了三个阶段:创建阶段,执行阶段和销毁阶段。
创建阶段
创建阶段主要做三件事:
- 创建变量对象:初始化函数参数arguments,提升函数声明和变量声明。(这就是JavaScript中一个非常重要的特性,变量提升的原因)
- 创建作用域链:这一步在创建变量对象的后面执行,用于解析变量,JavaScript会从代码最内层开始逐级从上一层的父作用域链中查找变量。
确定this的值:但是this真正的指向只有到了执行阶段才能真正确定。
执行阶段
- 变量赋值
- 函数引用
- 代码执行
回收阶段
出栈,等待回收