【JavaScript】varとletとconstとブロックスコープについて検証してみた
はじめに
以前までJavaScriptにはvar
しかなくブロックスコープはありませんでした。
最近はlet
とconst
が現れ、こちらはブロックスコープになります。
※ググると『JavaScriptにブロックスコープはない』ってのがヒットしますが古い情報なので注意してね。
検証コード
ブロックスコープの挙動については下記console.log
の結果に注目しながらご確認ください。
ちなみにconst
は上書き禁止の宣言ですが、スコープが異なれば当然別物になりますのでそのあたりも気にしながら!
ついでに変数巻き上げについても見ていきます!
// ---------------------------------------- // 変数a, b, c をグローバル変数で宣言し、挙動見ていく var a = "A"; let b = "B"; const c = "C"; console.log(a, b, c); // A B C // ---------------------------------------- // 関数スコープでは全て別物 (function () { console.log(a); // undefined ※変数巻き上げのため //console.log(b); // Uncaught ReferenceError: Cannot access 'b' before initialization //console.log(c); // Uncaught ReferenceError: Cannot access 'c' before initialization var a = "AA"; let b = "BB"; const c = "CC"; console.log(a, b, c); // AA BB CC })(); console.log(a, b, c); // A B C // ---------------------------------------- // varはブロックスコープではないので上書きされる { console.log(a); // A //console.log(b); // Uncaught ReferenceError: Cannot access 'b' before initialization //console.log(c); // Uncaught ReferenceError: Cannot access 'b' before initialization var a = "AA"; let b = "BB"; const c = "CC"; console.log(a, b, c); // AA BB CC } console.log(a, b, c); // AA B C // ---------------------------------------- // ブロックスコープ内で上書き { a = "AAA"; b = "BBB"; //c = "C"; // Uncaught TypeError: Assignment to constant variable. } console.log(a, b, c); // AAA BBB C // ---------------------------------------- // グローバルスコープ上で再定義 var a = "AAAA"; //let b = "BBBBB"; // Uncaught SyntaxError: Identifier 'b' has already been declared //const c = "CCCC"; // Uncaught SyntaxError: Identifier 'c' has already been declared console.log(a, b, c); // AAAA BBB C
ややこしいですが状況に応じて使い分けていきましょう!
さいごに
JSの挙動確認するときはRunstant Liteがオススメです!
上記ソースをコピペして試してみてね。