VAR, LET, CONST TRONG JAVASCRIPT: TỪ VŨNG LẦY LỊCH ĐẾN SỰ CHUẨN MỰC HIỆN ĐẠI
trong JavaScript, việc khai báo biến tưởng chừng như đơn giản nhưng lại là cạm bẫy lớn nhất khiến nhiều lập trình viên dính lỗi ngớ ngẩn (như biến "tự biến mất", lỗi trùng tên hay các lỗi kỳ quặc về phạm vi). Sức mạnh của JS hiện đại nằm ở sự phân định rạch ròi giữa 3 từ khóa: var, let, và const.
Dưới đây là bài viết mổ xẻ chi tiết sự khác nhau cốt lõi giữa 3 cách gọi biến này.
1. Bản Chất Và Lịch Sử (The Context)
var(Thời kỳ đồ đá - ES5 trở về trước): Là cách khai báo biến nguyên thủy của JavaScript. Nó mang trong mình rất nhiều cơ chế "ảo ma" gây khó hiểu cho người lập trình và hiện nay đã bị coi là Anti-pattern (tuyệt đối nên tránh dùng).let&const(Kỷ nguyên hiện đại - ES6 / 2015 trở đi): Được sinh ra để sửa chữa toàn bộ những lỗi thiết kế củavar, mang lại sự an toàn, tường minh và chuẩn mực cho các hệ thống JavaScript/TypeScript lớn.
2. So Sánh 3 Cột Mốc Cốt Lõi
Để phân biệt rạch ròi, chúng ta dựa vào 3 tiêu chí kỹ thuật sau:
A. Phạm Vi Hoạt Động (Scope)
var(Function Scope): Biến khai báo bằngvarchỉ có phạm vi bên trong hàm chứa nó. Nếu nó nằm ngoài hàm (ví dụ trong một khốiifhay vòng lặpfor), nó sẽ lọt ra ngoài và trở thành Global variable (biến toàn cục), dễ dàng bị ghi đè nhầm lẫn.let&const(Block Scope): Tuân thủ phạm vi khối{}cực kỳ nghiêm ngặt. Biến khai báo bên trong một vòng lặpfor, câu lệnhif, hay một cặp ngoặc nhọn bất kỳ thì chỉ tồn tại bên trong đó, chết đi ngay khi ra ngoài khối lệnh.
// Ví dụ về Scope với var vs let
if (true) {
var x = 10; // Lọt ra ngoài block!
let y = 20; // Chỉ sống trong block này!
}
console.log(x); // Kết quả: 10 (Vẫn in được, rất nguy hiểm)
console.log(y); // Lỗi: ReferenceError: y is not defined
B. Cơ Chế "Nâng" Biến (Hoisting) và Temporal Dead Zone (TDZ)
var(Có Hoisting nhưng bị gán giá trị mặc định làundefined): Khi chương trình chạy, JavaScript gom tất cả các khai báovarlên trên cùng của scope. Do đó, bạn có thể gọi biếnvartrước khi dòng code khai báo xuất hiện mà không báo lỗi (nhưng giá trị sẽ làundefined).let&const(Có Hoisting nhưng bị chặn bởi TDZ): Chúng cũng được đưa lên đầu scope, nhưng không được khởi tạo giá trị. Nếu bạn cố tình truy cập biến trước dòng khai báo, JS sẽ văng lỗi ngay lập tức (ReferenceError). Vùng đất cấm từ đầu scope đến điểm khai báo được gọi là Temporal Dead Zone.
console.log(a); // In ra: undefined (Không lỗi, nhưng rất dễ bug logic)
var a = 5;
console.log(b); // Lỗi: ReferenceError: Cannot access 'b' before initialization
let b = 10;
C. Khả Năng Gán Lại Giá Trị (Re-assignment & Mutability)
var&let(Có thể thay đổi): Cho phép bạn gán lại giá trị mới cho biến bất cứ lúc nào sau khi đã khai báo. Riêngvarcòn cho phép khai báo trùng tên biến liên tục trong cùng một scope mà không báo động gì.const(Hằng số - Bất biến): Viết tắt của từ Constant. Một khi đã gán giá trị choconst, bạn tuyệt đối không được gán lại giá trị khác cho nó nữa. Nếu cố tình gán lại, JS sẽ báo lỗi ngay lúc biên dịch.
Lưu ý kỹ thuật:
constkhóa địa chỉ tham chiếu, chứ không khóa giá trị bên trong. Nghĩa là nếuconsttrỏ đến mộtObjecthoặc mộtArray, bạn hoàn toàn có thể thay đổi thuộc tính bên trong object đó (obj.name = 'Hiếu'), nhưng không được phép gánobj = {}hoàn toàn mới.
3. Bảng Tổng Kết Nhanh Cho Kỹ Sư
| Tiêu chí | var |
let |
const |
|---|---|---|---|
| Phạm vi (Scope) | Function Scope | Block Scope ({}) |
Block Scope ({}) |
| Gán lại giá trị? | Có | Có | Không |
| Khai báo lại tên? | Có (Rất nguy hiểm) | Không | Không |
| Hoisting | Có (Trả về undefined) |
Có (Nằm trong TDZ - Lỗi) | Có (Nằm trong TDZ - Lỗi) |
| Khuyên dùng | Tuyệt đối KHÔNG | Dùng khi cần thay đổi giá trị | Ưu tiên dùng hàng đầu |
💡 Lời Khuyên Thực Chiến
Trong quy chuẩn viết code hiện đại (Clean Code), quy tắc vàng dành cho lập trình viên là:
- Mặc định sử dụng
constcho 90% các trường hợp (giúp code an toàn, không bị vô tình ghi đè dữ liệu). - Chỉ chuyển sang dùng
letkhi bạn biết chắc chắn biến đó sẽ phải thay đổi giá trị liên tục trong tương lai (ví dụ biến đếmitrong vòng lặpfor). - Vứt xó vĩnh viễn từ khóa
varra khỏi não bộ của bạn.
All rights reserved