范围
作用域 (scope) 是当前执行的上下文,在该上下文中,值和表达式是“可见”的,或者可以被引用。如果一个变量或表达式不在当前作用域中,它将不可用。作用域也可以以层级的方式嵌套,子作用域可以访问父作用域,但父作用域不能访问子作用域。
JavaScript 具有以下几种作用域:
- 全局作用域:所有在脚本模式下运行的代码的默认作用域。
- 模块作用域:在模块模式下运行的代码的作用域。
- 函数作用域:通过函数创建的作用域。
此外,使用特定语法声明的标识符,包括 let、const、class,或者(在严格模式下)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);
块作用域只作用于 let 和 const 声明,而不作用于 var 声明。
js
{
var x = 1;
}
console.log(x); // 1
js
{
const x = 1;
}
console.log(x); // ReferenceError: x is not defined