ぼちぼちあしあと

プログラム初心者の備忘録です。

巻き上げについて

結局、巻き上げについて記事にしてしまった・・・。

せえへんのかなあと思ったらすんのかい!

変数の初期値設定は以下のように書けることは以前に紹介した。

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

となっちゃう。