Hoisting và TDZ: vì sao biến ra undefined thay vì báo lỗi
Trước khi chạy bất kỳ dòng code nào trong một execution context, engine có một pha quét toàn bộ scope để đăng ký các khai báo. var và function declaration được đăng ký và khởi tạo ngay trong pha này; let, const, class cũng được đăng ký nhưng cố tình để chưa khởi tạo. Sự khác nhau ở bước "đã khởi tạo hay chưa" là toàn bộ câu chuyện hoisting, và là lý do cùng một lỗi truy cập sớm lúc thì ra undefined âm thầm, lúc thì throw ReferenceError ngay.
Cơ chế hoạt động
Khi vào một context, engine xử lý hai pha. Pha tạo (creation) duyệt qua scope và đăng ký mọi binding. Pha thực thi (execution) mới chạy code theo thứ tự dòng.
Trong pha tạo:






