本文档解释了 JavaScript 的执行上下文——JavaScript 代码被评估和执行的环境。它涵盖了 JavaScript 引擎如何创建和管理执行上下文、调用栈机制以及执行上下文与作用域之间的关系。有关异步 JavaScript 执行的信息,请参阅 异步 JavaScript。
执行上下文是 JavaScript 中的一个基本概念,它定义了 JavaScript 代码运行的环境。它包含有关变量、函数声明、作用域链以及 this 关键字的值的信息。每次执行 JavaScript 代码时,它都会在一个执行上下文中进行。
根据 ECMAScript 规范,每个执行上下文都有三个主要组成部分:
let 和 const 声明this 值的引用来源: README.md117-118
JavaScript 有三种类型的执行上下文:
全局执行上下文是在 JavaScript 脚本首次加载时创建的。它代表了代码执行的基准环境。在此上下文中:
window,Node.js 中为 global)。this 值设置为引用全局对象。每次调用函数时都会创建一个新的函数执行上下文。此上下文包括:
this 的值(取决于函数如何被调用)在 eval() 函数内执行代码时创建。由于安全和性能方面的考虑,这在现代 JavaScript 应用程序中很少使用。
来源: README.md117-118 README.md297-312
JavaScript 的执行发生在两个阶段:
在代码执行之前,JavaScript 引擎会:
this 的值在此阶段,变量声明被初始化为 undefined,函数声明被存储在内存中(提升)。
在此阶段,JavaScript 引擎逐行执行代码:
来源: README.md117-118 README.md468-474
调用栈是一个数据结构,用于跟踪代码执行期间的执行上下文。
考虑以下代码片段:
调用栈将按以下方式处理:
来源: README.md102-108 README.md126-136
作用域决定了变量和函数在代码不同部分的可访问性。它与执行上下文密切相关,但它们并非完全相同。
this 绑定。执行上下文在代码执行时创建,而作用域在编写代码时(词法作用域)确定。
作用域链允许内部函数访问外部函数和全局作用域中的变量。
来源: README.md284-312 README.md315-323
JavaScript 引擎实现了 ECMAScript 规范,在代码执行期间创建和管理执行上下文。
来源: README.md450-474
现代 JavaScript 引擎采用各种优化来提高执行上下文的性能:
来源: README.md461-463
理解执行上下文对 JavaScript 开发人员有几个实际意义:
this 绑定:this 的值取决于函数的调用方式。来源: README.md117-121 README.md834-848
var、let 和 const 之间令人困惑的变量提升行为。this 绑定。let 和 const 代替 var 以获得更可预测的作用域。this 绑定。