JS的执行上下文

 

定义

执行上下文时是代码执行时的环境,JS代码在运行前进行编译,那么会生成两部分,一部分是可执行的代码,而另一部分则是执行上下文。

作用

用于跟踪代码运行的运行情况。执行步骤如下:

  • 一段代码块对应一个执行上下文,被封装成函数的代码被视作一段代码块,或者“全局作用域”也被视作一段代码块。
  • 当程序运行,进入到某段代码块时,一个新的执行上下文被创建,并被放入执行栈中。当程序运行到这段代码块结尾后,对应的执行上下文被弹出栈。
  • 当程序在某段代码块中运行到某个点需要转到了另一个代码块时(调用了另一个函数),那么当前的可执行上下文的状态会被置为挂起,然后生成一个新的可执行上下文放入执行栈的顶部。
  • 执行栈最顶部的可执行上下文被称为 running execution context。当顶部的可执行上下文被弹出后,上一个挂起的可执行上下文继续执行。

类别

全局执行上下文、函数执行上下文和 eval 执行上下文

发展

执行上下文所包含的内容是在不断的变化的。它主要分为了三个不同的阶段。分别是ES3阶段,ES5阶段和ES9阶段

ES3阶段

  • variable object:变量对象,用于存储变量的对象。
  • scope:作用域,也常常被叫做作用域链。
  • this

ES5阶段

  • variable environment:变量环境, 当声明变量时使用。(此环境还包含了一个外部引用,用来指向外部的执行上下文,我们把这个外部引用称为 outer(外部环境))
  • lexical environment:词法环境, 当获取变量时使用。
  • this

ES9阶段

正常情况

正常情况会有如下四种

  • variable environment:变量环境,当声明变量时使用。
  • lexical environment:词法环境,当获取变量或者 this 值时使用。
  • code evaluation state:用于恢复代码执行位置。
  • Realm:使用的基础库和内置对象实例。

⚠️:this 值被归入 lexical environment

特定情况

在特定的情况下又会有如下三种

  • Function:执行的任务是函数时使用,表示正在被执行的函数。
  • ScriptOrModule:执行的任务是脚本或者模块时使用,表示正在被执行的代码。
  • Generator:仅生成器上下文有这个属性,表示当前生成器

参考

TC39规范:https://tc39.es/ecma262/#sec-type

https://segmentfault.com/a/1190000009522006

浏览器原理与实践

重学前端

原文地址:https://www.cnblogs.com/suihang/p/13384877.html