Khi dùng var trong vòng lặp for, tất cả callback chia sẻ cùng tham chiếu đến biến i — vì var là function scope, chỉ có một biến i duy nhất.
javascript
// Bug: in ra 3 3 3
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
// Fix 1: dùng let (block scope)
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0); // 0 1 2
}
// Fix 2: IIFE capture giá trị
for (var i = 0; i < 3; i++) {
(function(j) {
setTimeout(() => console.log(j), 0);
})(i);
}Đây là câu hỏi phỏng vấn cổ điển về closure.