Ngôn ngữ tương tác cho Web
Tìm hiểu sự khác biệt giữa var, let và const trong JavaScript. Từ hoisting, scope, temporal dead zone đến best practices trong modern JavaScript development.
varES5 LegacyletES6 Block ScopeconstES6 Immutablefunction example() {
if (true) {
var a = 1; // function scoped
let b = 2; // block scoped
const c = 3; // block scoped
}
console.log(a); // 1 (accessible)
console.log(b); // ReferenceError
console.log(c); // ReferenceError
}var được hoisted và có thể sử dụng trước khi khai báo
💡 var được hoisted (đưa lên đầu scope) và khởi tạo với undefined
console.log(x); // undefined (không lỗi)
var x = 5;
console.log(x); // 5
// Tương đương với:
// var x; // hoisted lên đầu
// console.log(x); // undefined
// x = 5;
function example() {
console.log(y); // undefined
var y = 10;
console.log(y); // 10
}
example();| Đặc điểm | var | let | const |
|---|---|---|---|
| Scope | Function/Global | Block | Block |
| Hoisting | Có (khởi tạo undefined) | Có (Temporal Dead Zone) | Có (Temporal Dead Zone) |
| Khai báo lại | Được phép | Không được phép | Không được phép |
| Gán lại giá trị | Được phép | Được phép | Không được phép |
| Khởi tạo bắt buộc | Không | Không | Có |
| Temporal Dead Zone | Không | Có | Có |
| Global object property | Có (tạo property) | Không | Không |
| Best for | Legacy code | Mutable variables | Immutable references |
✅ Giải pháp: Dùng let để tạo block scope riêng cho mỗi iteration
// ❌ Wrong
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // Prints 3, 3, 3
}
// ✅ Correct
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // Prints 0, 1, 2
}✅ Giải pháp: Luôn khai báo trước khi sử dụng để tránh TDZ error
// ❌ Wrong
console.log(x); // ReferenceError
let x = 5;
// ✅ Correct
let x = 5;
console.log(x); // 5✅ Giải pháp: Dùng let nếu cần reassign, const chỉ cho immutable references
// ❌ Wrong
const count = 0;
count = 1; // TypeError
// ✅ Correct
let count = 0;
count = 1; // OK
// ✅ Also correct for objects
const user = { name: "John" };
user.name = "Jane"; // OK - mutating content, not reference✅ Giải pháp: Ưu tiên const > let > tránh var
// ❌ Wrong (legacy style)
var name = "John";
var age = 25;
// ✅ Correct (modern style)
const name = "John";
let age = 25;✅ Giải pháp: const phải được khởi tạo ngay khi khai báo
// ❌ Wrong
const PI; // SyntaxError: Missing initializer
PI = 3.14;
// ✅ Correct
const PI = 3.14;varFunction scope, hoisting, nên tránh dùng trong JS hiện đại
letBlock scope, TDZ, có thể gán lại giá trị
constBlock scope, TDZ, không thể gán lại giá trị
Quy tắc cơ bản: Ưu tiên dùng const → dùng let khi cần gán lại giá trị → tránh dùng var! 🎯