変数は参照できますか?
重要性: 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
まで)は “デッドゾーン” と呼ばれることがあります。