JavaScriptのvarとletは、変数を宣言するためのキーワードですが、いくつかの重要な違いがあります。
スコープ
varは関数スコープを持ちます。これは、varで宣言された変数が関数内でアクセス可能であることを意味します。一方、letはブロックスコープを持ち、letで宣言された変数はそのブロック内でのみアクセス可能です。
function testVar() {
if (true) {
var x = 10;
}
console.log(x); // 10
}
function testLet() {
if (true) {
let y = 20;
}
console.log(y); // ReferenceError: y is not defined
}
ホイスティング
varで宣言された変数は、関数またはグローバルスコープの先頭に巻き上げられます。これは、変数が宣言される前に参照できることを意味します。ただし、その時点では未定義として扱われます。letで宣言された変数も巻き上げられますが、初期化前にアクセスしようとするとReferenceErrorが発生します。
console.log(a); // undefined
var a = 10;
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;
再宣言
同じスコープ内で、varを使用して既存の変数を再宣言することができますが、letでは再宣言が許されません。
var c = 30;
var c = 40; // No error
let d = 50;
let d = 60; // SyntaxError: Identifier 'd' has already been declared
グローバルオブジェクト
varで宣言されたグローバル変数は、グローバルオブジェクト(ブラウザではwindowオブジェクト)のプロパティとなります。letで宣言されたグローバル変数は、グローバルオブジェクトのプロパティにはなりません。
var e = 70;
console.log(window.e); // 70 (in a browser environment)
let f = 80;
console.log(window.f); // undefined (in a browser environment)
これらの違いを理解し、適切な変数宣言キーワードを選択することが重要です。一般的には、letやconstを使用してブロックスコープを活用することが推奨されています