返回

ES6 中的执行上下文

前端

ES6 中的执行上下文(execution context)

ES6 将执行上下文(execution context)分为两个阶段,分别是创建阶段与执行阶段。

创建阶段

在创建阶段主要分为三个步骤,确定临时死区、绑定变量以及参数。

  1. 确定临时死区

临时死区是指在变量声明之前,该变量是不可访问的。在 ES6 中,临时死区是从块级作用域的开始到变量声明为止。例如:

{
  let x = 10;
  console.log(x); // ReferenceError: x is not defined
}

在上面的代码中,变量 x 在块级作用域的开始处声明,因此在声明之前访问变量 x 会抛出 ReferenceError。

  1. 绑定变量

在创建阶段,会将变量与它的值绑定在一起。如果变量没有被初始化,则会被绑定为 undefined。例如:

let x;
console.log(x); // undefined

在上面的代码中,变量 x 没有被初始化,因此在创建阶段就被绑定为 undefined。

  1. 参数

在创建阶段,函数的参数也会被绑定到它的值。如果函数的参数没有被指定默认值,则会被绑定为 undefined。例如:

function sum(a, b) {
  console.log(a, b); // undefined undefined
}

sum();

在上面的代码中,函数 sum 的参数 a 和 b 没有被指定默认值,因此在创建阶段就被绑定为 undefined。

执行阶段

在创建阶段之后,就会进入执行阶段。在执行阶段,会依次执行代码。执行阶段的步骤如下:

  1. 执行全局代码

在执行阶段的开始,会执行全局代码。全局代码是指没有在任何函数或块级作用域中定义的代码。例如:

console.log("Hello, world!");

在上面的代码中,console.log("Hello, world!") 是全局代码,因此会在执行阶段的开始执行。

  1. 执行函数代码

在执行完全局代码之后,就会执行函数代码。函数代码是指在函数中定义的代码。例如:

function sum(a, b) {
  return a + b;
}

const result = sum(1, 2);

在上面的代码中,sum(1, 2) 是函数代码,因此会在执行阶段的第二步执行。

  1. 执行块级作用域代码

在执行完函数代码之后,就会执行块级作用域代码。块级作用域代码是指在块级作用域中定义的代码。例如:

{
  let x = 10;
  console.log(x); // 10
}

在上面的代码中,{ let x = 10; console.log(x); } 是块级作用域代码,因此会在执行阶段的第三步执行。

执行上下文的作用

执行上下文在 JavaScript 代码的执行过程中起着非常重要的作用。执行上下文可以帮助我们理解 JavaScript 代码的执行过程,并可以帮助我们更好地调试 JavaScript 代码。例如,我们可以通过执行上下文来了解变量的声明位置和作用域,以及函数的参数是如何被绑定的。