var, let và const đều khai báo biến trong JavaScript, nhưng khác nhau về scope, hành vi khai báo lại, và khả năng gán lại giá trị.
varcó function scope — biến "lan" ra toàn bộ function chứa nó, bất kể nó được khai báo trong block nào.letvàconstcó block scope — biến chỉ tồn tại bên trong cặp{}nó được khai báo.varcho phép khai báo lại cùng tên trong cùng scope.letvàconstkhông cho phép — làm vậy sẽ báo lỗi ngay.letcho phép gán lại giá trị.constthì không. Tuy nhiên,constvới object hoặc array vẫn cho phép thay đổi nội dung bên trong, vì nó chỉ chặn gán lại biến đó bằng tham chiếu mới.
javascript
// var "lan" ra ngoài block
for (var i = 0; i < 3; i++) {}
console.log(i); // 3 — biến i vẫn tồn tại
// let bị giới hạn trong block
for (let j = 0; j < 3; j++) {}
console.log(j); // ReferenceError: j is not definedVí dụ về const với object:
javascript
const user = { name: "An" };
user.name = "Binh"; // hợp lệ — đổi property, không gán lại biến
user = { name: "Tan" }; // TypeError: Assignment to constant variableMột điểm nữa với var: biến được "khai báo" ở đầu function (hoisting) nhưng giá trị là undefined cho đến khi dòng thực thi chạy đến. let và const cũng được hoist nhưng ở trong "temporal dead zone" (TDZ) — đọc trước dòng khai báo sẽ bị lỗi ReferenceError, không trả về undefined.
Lưu ý: Mặc định dùng const, dùng let khi cần gán lại giá trị, và hạn chế var trong code mới. var vẫn xuất hiện trong codebase cũ và bạn cần hiểu hành vi của nó khi bảo trì.