JavaScript 中的执行上下文和执行栈

487 阅读2分钟

执行上下文

概念

执行上下文是评估和执行 JavaScript 代码的环境的抽象概念。

执行上下文的类型

全局执行上下文

  • 不在函数内部的代码都属于全局执行上下文,
  • 全局执行上下文会创建一个window对象(浏览器环境下),然后设置this的值等于window,
  • 一个程序中只会有一个全局执行上下文。

函数执行上下文

  • 函数被调用时创建。
  • 当一个新的执行上下文被创建,它会按定义的顺序执行一系列步骤。

Eval 函数执行上下文

  • eval()函数动态执行的代码并不会创建新的作用域,其代码就是在当前的作用域执行的。
  • eval()函数也完全可以使用当前作用域的this,argument等对象。

执行盏

  • 一种拥有 LIFO(后进先出)数据结构的栈,
  • 被用来存储代码运行时创建的所有执行上下文。
  • 当 JavaScript 引擎第一次遇到你的脚本时,它会创建一个全局的执行上下文并且压入当前执行栈。
  • 每当引擎遇到一个函数调用,它会为该函数创建一个新的执行上下文并压入栈的顶部。
  • 引擎会执行那些执行上下文位于栈顶的函数。
  • 当该函数执行结束时,执行上下文从栈中弹出,控制流程到达当前栈中的下一个上下文。

this绑定

  • 在全局执行上下文中,this 的值指向全局对象。(在浏览器中,this引用 Window 对象)。
  • 在函数执行上下文中,this 的值取决于该函数是如何被调用的。如果它被一个引用对象调用,那么 this 会被设置成那个对象,否则 this 的值被设置为全局对象或者 undefined(在严格模式下)。