Cho đoạn mã, cần đoán đầu ra và giải thích:
var name = 'Zakir'; (() => { name = 'Rahul'; return; console.log(name); function name(){ let lastName = 'Singh'; } })(); console.log(name);Phân tích sơ bộ (sai):
- 'Zakir' lưu vào biến name
- Vào IIFE
- Biến name gán lại 'Rahul'
- Gặp return, thoát hàm
- In name toàn cục → 'Rahul'
Kết quả sai. Phân tích đúng với hoisting:
- 'Zakir' lưu vào biến name toàn cục
- Vào IIFE
- Hàm
name()được nâng lên đầu phạm vi hàm - Tại thời điểm đó, code như sau:
Ví dụ trạng thái trung gian
let name = 'Zakir'; (() => { let name; name = 'Rahul'; return; console.log(name); name = function(){ let lastName = 'Singh'; } })(); console.log(name);Biến cục bộ name được khai báo (hoisting), gán 'Rahul' cho biến cục bộ, không ảnh hưởng biến toàn cục. Thoát hàm, in biến toàn cục vẫn là 'Zakir'.
Kết quả
Zakir