| Đặc điểm | var |
let |
|---|---|---|
| Scope | Function-scoped (hoặc global) | Block-scoped ({}) |
| Hoisting | Hoisted, init = undefined |
Hoisted nhưng **Temporal Dead Zone** — truy cập trước khai báo → ReferenceError |
| Redeclare | Cho phép var x=1; var x=2; |
Cấm let x=1; let x=2; → SyntaxError |
| Global object | var x=1 → window.x tồn tại |
let x=1 (global) → window.x = undefined |
| Loop closure | Vấn đề classic: for(var i...) capture same i |
for(let i...) tạo binding mới mỗi iteration — fix closure |
Ví dụ minh họa
let a = 'hello'; // global let var b = 'world'; // global var console.log(window.a); // undefined console.log(window.b); // 'world' var a = 'hello'; var a = 'world'; // OK let b = 'hello'; let b = 'world'; // SyntaxError: Identifier 'b' has already been declared
Khuyến nghị: Mặc định dùng const, cần reassign mới dùng let. Tránh var trong code modern.