範圍

作用域 (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