レッスンに戻る

変数は参照できますか?

重要性: 4

このコードの結果はどうなるでしょう?

let x = 1;

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

  let x = 2;
}

func();

P.S. このタスクには落とし穴があります。

結果は: エラー です。

実行してみましょう:

let x = 1;

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

func();

この例では、“存在しない” 変数と “初期化されていない” 変数の変わった違いを見ることができます。

記事 変数スコープ、クロージャ でご覧になったかもしれませんが、変数は実行がコードブロック(または関数)に入った時点から、“初期化されていない” 状態 で始まります。そして対応する let 文まで初期化されません。

つまり、変数は技術的には存在しますが、let 以前では利用できません。

上のコードを説明します。

function func() {
  // エンジンは関数の最初の時点でローカル変数 x を知っています。
  // が、let までは "初期化されていません" (利用できません)
  // なのでエラーです

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

  let x = 2;
}

変数が一時的に利用できないゾーン(コードブロックの先頭から let まで)は “デッドゾーン” と呼ばれることがあります。