JavaScriptの変数型var
・let
・const
について、var
の使用が非推奨とされる理由について、各変数宣言の特徴や巻き上げなどの観点からまとめます。
JavaScriptの変数宣言にはvar
・let
・const
の3種類があります。
1var a;
2let b;
3const c;
それぞれの特徴について見てみましょう。
var | let | const | |
---|---|---|---|
再代入 | ○ | ○ | × |
再宣言 | ○ | × | × |
スコープ | 関数スコープ | ブロックスコープ | ブロックスコープ |
再代入とは宣言した変数に、再度値を代入することです。var
・let
は再代入が可能ですが、const
は不可能です。
1//再代入可能
2var a = 1;
3a = 2;
4
5//再代入可能
6let b = 1;
7b = 2;
8
9//エラーが起きる
10//Uncaught TypeError:
11const c = 1;
12c = 2;
ここで、const
は単なる再代入はできませんが、オブジェクト型の中身を変更することができます。
1const obj = {
2 id: 01;
3 name: "オブジェクト1";
4}
5//オブジェクトの中身は変えられる
6obj.name = "オブジェクト2";
再宣言とは、宣言した変数名を再度宣言し直すことです。var
は再宣言が可能ですが、let
・const
は不可能です。
1//再宣言可能
2var a = "宣言1回目";
3var a = "宣言2回目";
4
5//エラーが起きる
6//Uncaught SyntaxError:
7let b = "宣言1回目";
8let b = "宣言2回目";
9
10//エラーが起きる
11//Uncaught SyntaxError:
12const c = "宣言1回目";
13const c = "宣言2回目";
スコープとは関数を呼び出すことが出来る範囲のことです。var
のスコープは関数スコープであり、ある関数内で宣言した変数は、その関数のどこからでも呼び出すことができます。
1function x() {
2
3 var a = 1;
4 console.log(a);
5 {
6
7 a = 2;
8 console.log(a);
9 }
10 console.log(a);
11}
12
13//出力結果
14//1
15//2
16//2
対して、let
・const
のスコープはブロックスコープです。関数スコープと違い、関数内の記述位置でスコープから外れます。
1function x() {
2
3 let b = 1;
4 console.log(b);
5 {
6
7 b = 2;
8 console.log(b);
9 }
10 console.log(b);
11}
12
13//出力結果
14//1
15//2
16//1
JavaScriptには変数の巻き上げという独特の特徴を有しています。関数内で宣言された変数は、関数の先頭で宣言したとみなされます。
1var x = "Test1";
2
3function func() {
4 console.log(x); // undefinedが出力される
5 var x = "Test2";
6 console.log(x); // Test2
7}
上のコードではx
の宣言前にconsole.log
で記述していて、一見Test1
が出力される気がしますが、undefined
(未定義)が出力されます。これが変数の巻き上げで、上のコードは実行時には下のコードのように見なされます。
1var x = "Test1";
2
3function func() {
4 var x; //変数の巻き上げ
5 console.log(x); // undefinedが出力される
6 x = "Test2";
7 console.log(x); // Test2
8}
上で述べた様に、var
は再宣言・再代入が可能であること、スコープの範囲が広いこと、巻き上げの特徴を持つことから、変数の値が意図しない影響を受けてしまう可能性があります。
上記のような仕様から、特に複雑なソースコードではvar
を使用を避けるべきであると言えます。
基本的には変数宣言にはconst
を使い、const
だけでは難しい場合にlet
を使うようにしましょう。例えばfor文
などは使うのはlet
ですね。
今回はJavaScriptの変数型についてまとめました。以上で記事を終わりにします。