只有理解了执行上下文,才能更好的理解 JavaScript 语言本身。

JavaScript 代码的执行流程

<aside> ✅ JS 代码 —> 编译阶段 —> 执行阶段

</aside>

JavaScript 代码执行过程中,需要先做变量提升,之所以需要实现变量提升,是因为 JavaScript 代码在执行之前需要先编译。

在编译阶段,变量和函数会被存放到变量环境中,变量的默认值会被设置为 undefined;在代码执行阶段,JavaScript 引擎会从变量环境中去查找自定义的变量和函数。

如果在编译阶段,存在两个相同的函数,那么最终存放在变量环境中的是最后定义的那个,因为后定义的会覆盖掉之前的。

回顾 JS 代码运行的各个阶段

以 V8 引擎为例,JS 代码的运行过程主要分为三个阶段:
1.词法分析阶段。对代码做语法分析,检查语法,发现错误会在控制台抛出异常并终止执行。
2.编译阶段。创建执行上下文,包括创建词法环境、创建变量对象、建立作用域链、确定 this 指向并绑定 this 等。每进入一个不同的运行环境时,V8 都会创建一个新的执行上下文。
3.执行阶段。将编译阶段创建的执行上下文压入调用栈,并成为正在运行的执行上下文,代码执行结束后,将其弹出调用栈。

编译阶段

编译阶段做了几件事:

  1. 创建执行上下文
  2. 创建变量对象
  3. 创建作用域链
  4. 确定 this 指向

JS 的运行环境包括 全局执行上下文、函数执行上下文、eval 执行上下文。