レッスンに戻る

変数は表示されますか?

重要度: 4

このコードの結果はどうなりますか?

let x = 1;

function func() {
  console.log(x); // ?

  let x = 2;
}

func();

追伸 このタスクには落とし穴があります。解決策は明らかではありません。

結果は: エラーです。

実行してみる

let x = 1;

function func() {
  console.log(x); // ReferenceError: Cannot access 'x' before initialization
  let x = 2;
}

func();

この例では、「存在しない」変数と「初期化されていない」変数の特異な違いを確認できます。

記事変数スコープ、クロージャーで読んだように、変数は、実行がコードブロック(または関数)に入った瞬間から「初期化されていない」状態から始まります。また、対応するletステートメントがあるまで初期化されません。

言い換えれば、変数は技術的には存在しますが、letの前に使用することはできません。

上記のコードはそれを示しています。

function func() {
  // the local variable x is known to the engine from the beginning of the function,
  // but "uninitialized" (unusable) until let ("dead zone")
  // hence the error

  console.log(x); // ReferenceError: Cannot access 'x' before initialization

  let x = 2;
}

この変数が一時的に使用できなくなるゾーン(コードブロックの最初からletまで)は、「デッドゾーン」と呼ばれることがあります。