01/10/2018, 11:56

Closure pitfalls : The Infamous Loop Problem

Pro nào giải thich cho e vấn đề The Infamous Loop Problem trong Closure của js với, e đọc khá nhiều tài liệu mà vẫn ko hiểu !. Bác nào nhiệt tình giải thich cho e càng chi tiết càng tốt nhé!

明玉 viết 14:03 ngày 01/10/2018

Hiểu thế này cho dễ:
Sau khi bạn tạo ra 1 function, nó sẽ lưu hết toàn bộ những variable trên nó, từ trong ra ngoài, lưu ở đây là lưu tham chiếu, ko phải lưu giá trị. Sau này gọi vào function đó, bạn có thể sử dụng những variable phía trên nó.
Cho vòng lặp như vầy:

let a = []
for (int i = 1; i <= 5; i++)
    a.push(() => console.log(i))
a.forEach((v) => v())

Kết quả ra 5 số 5, vì biến i chỉ có một biến, hàm thì có 5 hàm được tạo ra đều giữ tham chiếu tới i. Giá trị cuối của i là 5, thế là cả 5 hàm số đều giữ tham chiếu tới 5.
Để 5 hàm số này trỏ tới 5 giá trị khác nhau từ 1 tới 5, cứ một lần tạo hàm số thì phải tạo 1 biến riêng cho nó:

let a = []
for (int i = 1; i <= 5; i++) {
    let tmp = i
    a.push(() => console.log(tmp))
}
a.forEach((v) => v())

Biến tmp sẽ đc tạo ra 5 lần, mỗi cái riêng cho mỗi hàm.

Bài liên quan
0