JavaScript中的执行上下文和作用域

70 阅读3分钟

执行上下文(execution context)

  • 全局执行上下文:

    javaScript程序开始运行时创建的第一个执行上下文。是全局作用域,在函数外部定义的变量都是全局变量。

    注意:在全局执行上下文中,this指向的是window对象。

  • 函数执行上下文:

    函数每次被调用都会创建一个新的执行上下文,代表函数的作用域。每个函数都有它自己的执行上下文,一个程序可以有多个函数上下文。

  • Eval函数执行上下文:

    Eval函数是JavaScript中的一个内置函数,用于执行动态创建的JavaScript代码。

执行栈(execution stack)

执行栈是javaScript引擎用于维护当前执行的代码的一种数据结构。

image.png

创建执行上下文的过程叫做执行上下文的入栈(Push)。当 JavaScript 引擎遇到 return 语句或者执行完毕时,会执行执行上下文的出栈(Pop)操作,即将当前执行上下文从执行栈中弹出。

执行上下文文生命周期

创建阶段

创建阶段即代码即将运行之前,也就是代码被解析之前的过程。

主要任务:

  • 确定this的值(this绑定):this 的值取决于函数的调用方式,可以是默认绑定、隐式绑定、显式绑定、new 绑定或箭头函数绑定。
  • 创建词法环境:词法环境分为全局环境和函数环境
  • 创建变量环境:变量环境是通过词法环境来实现的。

执行阶段

  1. 在执行栈的顶部开始执行代码
  2. 在执行过程中,遇到一个函数调用,会创建一个新的执行上下文并将其加入执行栈的顶部。
  3. 在执行过程中,当遇到一个return语句,会终止当前执行上下文并将其从执行栈中弹出。
  4. 在执行过程中,当执行栈为空时,代码执行完毕

销毁阶段

在销毁阶段,执行上下文被销毁。包括清除执行上下文中的信息,并释放相关的资源。

变量对象

变量对象是执行上下文中存储变量和函数声明的对象。

注意:在全局执行上下文中,变量对象是window对象;在函数执行上下文中,变量对象是arguments对象。

作用域链和作用域

作用域链

作用域链是描述上下文中可访问的变量和函数,是变量的一个属性。

作用域链是一个从内到外的双向链表,其中第一个节点是变量对象本身,每个后继节点都是一个对象。

在全局执行上下文中,作用域链只包含一个节点,即变量对象本身;在函数执行上下文中,作用域链包含变量对象和它的所有父级函数的变量对象。

作用域

作用域是代码中变量和函数可以被访问的范围。

ECMAScript 中有两种作用域:全局作用域和局部作用域。全局作用域是最外层的作用域,它包含了整个代码。局部作用域是在函数内部创建的作用域,它只包含了函数内部的代码。

参考来源:zhuanlan.zhihu.com/p/601678386