JavaScript | 変数を宣言

JavaScript
スポンサーリンク

基本の文法と違い

特徴varletconst
再宣言可能エラーになるエラーになる
再代入可能可能❌ できない
スコープ関数スコープブロックスコープブロックスコープ
巻き上げされる(undefined)されるが参照エラーになるされるが参照エラーになる
初期化後で可後で可宣言時に初期化必須

1. スコープの違い(最も重要)

🔹 var は「関数スコープ」

  • 関数内で宣言されたら、関数全体で有効
  • ブロック {} 内で宣言しても、その外でもアクセスできる
function testVar() {
  if (true) {
    var a = 100;
  }
  console.log(a); // ✅ 100 → if ブロックの外でも使える
}
testVar();

🔹 let / const は「ブロックスコープ」

  • ブロック {} ごとに変数のスコープが限定される
function testLetConst() {
  if (true) {
    let b = 200;
    const c = 300;
  }
  console.log(b); // ❌ エラー
  console.log(c); // ❌ エラー
}

2. 再宣言の違い

var x = 10;
var x = 20; // ✅ 問題なし

let y = 10;
let y = 20; // ❌ エラー:再宣言できない

const z = 30;
const z = 40; // ❌ エラー:再宣言できない

3. 再代入の違い

let a = 1;
a = 2; // ✅ OK

const b = 1;
b = 2; // ❌ エラー:再代入できない

ただし、constでオブジェクトを宣言した場合、プロパティの変更はOK!

const person = { name: "Alice" };
person.name = "Bob"; // ✅ OK!中身の変更はできる

4. 巻き上げ(ホイスティング)の違い

  • JavaScriptでは、変数の宣言が関数やスコープの先頭に「巻き上げられる」
  • var の場合 → 変数が「undefined」で初期化されている
  • let / const → 巻き上げはされるが、使う前にアクセスするとエラー
console.log(x); // undefined
var x = 10;

console.log(y); // ❌ ReferenceError
let y = 20;

console.log(z); // ❌ ReferenceError
const z = 30;

5. 宣言なしの代入(非推奨!)

function test() {
  undeclaredVar = 123;
}
test();
console.log(undeclaredVar); // ✅ グローバル変数として存在してしまう(危険)

これはバグの原因になりやすい。
解決策:"use strict"; モードを使うとエラーになる。

"use strict";
undeclaredVar = 123; // ❌ ReferenceError

6. どれを使うべき?

現代の推奨ルール(ベストプラクティス)

  • var は使わない(予期しない動作を避けるため)
  • 基本は const(不変の変数を使うことでバグ防止)
  • 再代入が必要なら let
const name = "Alice";    // 基本は const
let count = 0;           // 再代入するなら let

7. 使い分けの例:ループ内のスコープ

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// 出力: 3, 3, 3(varは関数スコープだから)

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// 出力: 0, 1, 2(letはブロックスコープだから)

まとめ

目的推奨するキーワード
値が変わらない定数const
値を変更する変数let
レガシーな互換性のみvar(非推奨)

JavaScript | MDN
JavaScript (JS) は軽量でインタープリター型(あるいは実行時コンパイルされる)第一級関数を備えたプログラミング言語です。ウェブページでよく使用されるスクリプト言語として知られ、多くのブラウザー以外の環境、例えば Node.js...

タイトルとURLをコピーしました