范围

作用域是当前执行上下文,在该上下文中,和表达式是“可见的”或可以引用的。如果变量或表达式不在当前作用域中,则无法使用。作用域还可以分层,以便子作用域可以访问父作用域,反之则不行。

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

另请参阅