Hoisting: khai báo được "nâng" lên đầu scope lúc biên dịch. Nhưng cách khởi tạo khác nhau:
var | let / const | |
|---|---|---|
| Scope | function | block {} |
| Hoist | có, khởi tạo undefined | có, nhưng TDZ |
| Truy cập trước khai báo | undefined | ReferenceError |
| Gán lại | được | let được, const không |
| Redeclare cùng scope | được | không |
- TDZ (Temporal Dead Zone): vùng từ đầu block tới dòng khai báo
let/const— truy cập ở đây némReferenceError. constkhóa việc gán lại binding, không "đóng băng" object — vẫn sửa được property (muốn bất biến thật thìObject.freeze).- Function declaration được hoist cả thân hàm; function expression thì không.
Thực hành: mặc định dùng const, cần gán lại thì let, tránh var.