巻き上げについて
結局、巻き上げについて記事にしてしまった・・・。
せえへんのかなあと思ったらすんのかい!
変数の初期値設定は以下のように書けることは以前に紹介した。
var seisuu = 10;
var(やlet)の場合、初期値設定は、以下のように2行に分けて書くことができる。
var seisuu; // 宣言 seisuu = 10; // 代入
まどろっこしいが、実際こう書ける。
ここで、
seisuu = 10;
console.log(seisuu);
var seisuu;
というコードを書いたとする。(なんでそう書いたのかはここでは触れない)
すると10が出力されるではないか!
これがいわゆる巻き上げである。
定義式(ここではvar seisuu;)は上で書こうが下で書こうが、同じ挙動を示すのだ。
では、次のコードを書いた場合はどうなるか?
console.log(seisuu);
var seisuu;
seisuu = 10;
これはErrorにならず、出力はundefinedとなる。
定義式のみ巻き上げが起こるからだ。
(代入式は巻き上げが起こらない。だってもし起こったら代入が実質1回しかできないことになるでしょ!)
この巻き上げ、varで変数を定義した時のみ起こる。letやconstでは起きない。これもvarとletとconstの違うところである。
seisuu = 10; console.log(seisuu); // ReferenceError: Cannot access 'seisuu' before initializationになる let seisuu;
念押しに一つ。
console.log(seisuu);
var seisuu = 10;
となるとどうなるか?
くどいが、定義式のみ巻き上げられるので(代入式は巻き上げられず)、undefinedになる。
余談 constを2行に分けて書こうとすると、
SyntaxError: Missing initializer in const declaration
となっちゃう。