javascriptでの変数の宣言方法による違いをまとめておきます。letやらvarやらです。
宣言、普段なんとなくやっちゃうんですが、大事ですよね。
1. let
-
スコープ: ブロックスコープ(
if
文やfor
文などのブロック内でのみ有効) - 再代入: 可能(変数の値を変更できる)
- 再宣言: できない(同じスコープ内で再宣言を試みるとエラー)
- 巻き上げ: 巻き上げはされるが、一時的死角(TDZ)があるため、宣言前にアクセスするとエラーになる
-
グローバルオブジェクトへの追加: しない(グローバルスコープで
let
で宣言した場合、window
やglobal
オブジェクトにプロパティとして追加されない)
let x = 10;
x = 20; // 再代入は可能
console.log(x); // 20
2. const
-
スコープ: ブロックスコープ(
let
と同様にブロック内でのみ有効) - 再代入: できない(定数なので、値を変更することができない)
- 再宣言: できない(同じスコープ内で再宣言を試みるとエラー)
-
巻き上げ: 巻き上げはされるが、
let
と同様に一時的死角(TDZ)があり、宣言前にアクセスするとエラー -
グローバルオブジェクトへの追加: しない(
const
もグローバルスコープで宣言しても、グローバルオブジェクトには追加されない)
const y = 30;
y = 40; // エラー:再代入できない
3. var
-
スコープ: 関数スコープ(関数内でのみ有効。関数外で
var
を使うとグローバルスコープになる) -
再代入: 可能(
let
と同様に値を変更できる) - 再宣言: 可能(同じスコープ内で再宣言してもエラーにはならない)
-
巻き上げ: 巻き上げが起き、変数は宣言されるが初期化されないため、宣言前にアクセスすると
undefined
になる -
グローバルオブジェクトへの追加: する(グローバルスコープで
var
で宣言した場合、window
やglobal
オブジェクトにプロパティとして追加される)
var z = 50;
var z = 60; // 再宣言が可能
console.log(z); // 60
4. 「何もなし」(宣言なし)
- スコープ: グローバルスコープ(関数やブロック内で宣言しない場合、変数は自動的にグローバルスコープに追加される)
- 再代入: 可能(宣言せずに代入した場合も変数に値を設定できる)
- 再宣言: できる(変数が既にグローバルスコープに存在していても、再宣言することができる)
- 巻き上げ: なし(宣言しない場合、巻き上げは起きない)
-
グローバルオブジェクトへの追加: する(宣言しない場合、
window
やglobal
オブジェクトに追加される)
x = 70; // 宣言なしで代入
console.log(x); // 70
比較まとめ
特性 | let |
const |
var |
何もなし(宣言なし) |
---|---|---|---|---|
スコープ | ブロックスコープ | ブロックスコープ | 関数スコープ | グローバルスコープ |
再代入 | 可能 | 不可 | 可能 | 可能 |
再宣言 | 不可 | 不可 | 可能 | 可能 |
巻き上げ | 一時的死角(TDZ) | 一時的死角(TDZ) | 初期化されず、undefined になる |
なし |
グローバルオブジェクト追加 | しない | しない | する | する |
結論
-
let
とconst
は、どちらもブロックスコープで、スコープ内での変数管理をより厳密に行いたい場合に使う。const
は値が変更されない定数を宣言する場合に使う。 -
var
は、古いコードや関数スコープで動作する必要がある場合に使わるが、現代のJavaScriptではlet
やconst
を使用することが推奨さる。 - 変数を宣言しない場合(何もなし)は、グローバルスコープに変数が追加されてしまう。予期しないバグやセキュリティ問題を引き起こす可能性があるため、避けた方がよい。