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