浅谈执行上下文(EC)和执行上下文栈

这块内容比较晦涩,简单的来理解一下,做个记录,有机会深入研究。

执行上下文

执行上下文(Execution Context,简称EC)在JavaScript中式一个非常重要的概念,我们可以简单的将其理解为JavaScript的运行环境,根据环境的不同,我们把执行上下文又可以分为三类:

  • 全局执行上下文
  • 函数执行上下文
  • eval执行上下文
    他们有这样的特性:
  • 全局执行上下文只有一个,但是函数执行上下文可以有很多个
  • 单线程,从上往下同步执行
  • 函数每被调用一次就会生成一个执行上下文环境

执行上下文栈

我们这样来看执行上下文栈:
1.在代码执行执行前,会先创建一个栈来管理和储存所有的执行上下文对象。
2.全局执行上下文首先会被确定,然后被添加到这个栈中(入栈)
3.当一个函数上下文确定之后,他也会被添加到这个栈中,并且他会被放在全局执行上下文的上面(入栈)
4.当第二个函数上下文确定的时候,他也会被放到栈中,且放到最上方,后面的一样。(入栈)
5.当一个函数上下文执行完成,我们会将其移除出栈,这个时候他必定存在于栈顶。(出栈,销毁)
6.当所有的函数上下文都执行完成,栈中还剩下一个执行上下文,就是全局执行上下文。
7.当浏览器关闭时,全局上下文被移除出栈。(出栈,销毁)

执行上下文的生命周期

从上面的流程我们可以看到,执行上下文其实分成了三个阶段:创建阶段,执行阶段和销毁阶段。

创建阶段

创建阶段主要做三件事:

  • 创建变量对象:初始化函数参数arguments,提升函数声明和变量声明。(这就是JavaScript中一个非常重要的特性,变量提升的原因)
  • 创建作用域链:这一步在创建变量对象的后面执行,用于解析变量,JavaScript会从代码最内层开始逐级从上一层的父作用域链中查找变量。
    确定this的值:但是this真正的指向只有到了执行阶段才能真正确定。

执行阶段

  • 变量赋值
  • 函数引用
  • 代码执行

回收阶段

出栈,等待回收

你可能感兴趣的:(浅谈执行上下文(EC)和执行上下文栈)