范围

作用域 (scope) 是当前执行的上下文,在该上下文中,和表达式是“可见”的,或者可以被引用。如果一个变量或表达式不在当前作用域中,它将不可用。作用域也可以以层级的方式嵌套,子作用域可以访问父作用域,但父作用域不能访问子作用域。

JavaScript 具有以下几种作用域:

  • 全局作用域:所有在脚本模式下运行的代码的默认作用域。
  • 模块作用域:在模块模式下运行的代码的作用域。
  • 函数作用域:通过函数创建的作用域。

此外,使用特定语法声明的标识符,包括 letconstclass,或者(在严格模式下)function,可以属于一个附加的作用域:

  • 块作用域:通过一对花括号(一个)创建的作用域。

一个函数会创建一个作用域,因此(例如)在函数内部定义的变量无法在函数外部或在其他函数内部访问。例如,以下代码是无效的:

js
function exampleFunction() {
  const x = "declared inside function"; // x can only be used in exampleFunction
  console.log("Inside function");
  console.log(x);
}

console.log(x); // Causes error

然而,由于变量在函数外部声明,使其成为全局变量,因此以下代码是有效的:

js
const x = "declared outside function";

exampleFunction();

function exampleFunction() {
  console.log("Inside function");
  console.log(x);
}

console.log("Outside function");
console.log(x);

块作用域只作用于 letconst 声明,而不作用于 var 声明。

js
{
  var x = 1;
}
console.log(x); // 1
js
{
  const x = 1;
}
console.log(x); // ReferenceError: x is not defined