このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

Scope (スコープ)

スコープが「見える」、または参照できる現在の実行コンテキストです。変数や式は現在のスコープ内にない場合、使用できません。スコープは階層構造で階層化して、子スコープから親スコープにアクセスできるようにすることもできますが、その逆はできません。

JavaScript には、次のようなスコープがあります。

  • グローバルスコープ:スクリプトモードで実行中の全コードのデフォルトスコープです。
  • モジュールスコープ:モジュールモードで実行中のコードのスコープです。
  • 関数スコープ:関数を使用して作成されるスコープです。

さらに、letconstclass、(厳格モードでの) function などの特定の構文で宣言された識別子は、もう一つのスコープに属することがあります。

  • ブロックのスコープ:中括弧(ブロック)の組み合わせで生成されるスコープです。

関数はスコープを作成して、 (例えば) 関数内で排他的に定義された変数に、関数の外側からや他の関数の中からアクセスできないようになります。たとえば、次のものは無効です。

js
function exampleFunction() {
  const x = "関数内で宣言"; // x は exampleFunction の中でのみ使用可能
  console.log("関数内");
  console.log(x);
}

console.log(x); // エラーが発生

しおかし、次のコードでは変数が関数外で宣言されており、グローバルになるため、有効になります。

js
const x = "関数の外で宣言";

exampleFunction();

function exampleFunction() {
  console.log("関数内");
  console.log(x);
}

console.log("関数外");
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

関連情報