xem xét vòng lặp như vậy:JavaScript biến ràng buộc và vòng lặp
for(var it = 0; it < 2; it++)
{
setTimeout(function() {
alert(it);
}, 1);
}
Đầu ra là:
=> 2
=> 2
Tôi muốn nó là: 0, 1. Tôi thấy hai cách để giải quyết nó:
Giải pháp # 1.
Điều này dựa trên thực tế là chúng tôi có thể chuyển dữ liệu đến setTimeout.
for(var it = 0; it < 2; it++)
{
setTimeout(function(data) {
alert(data);
}, 1, it);
}
Giải pháp # 2.
function foo(data)
{
setTimeout(function() {
alert(data);
}, 1);
}
for(var it = 0; it < 2; it++)
{
foo(it);
}
Có bất kỳ lựa chọn thay thế khác?
+1. Tuy nhiên, bạn có thể sửa đổi điều này bằng cách thay đổi chữ ký của phương thức thành: 'function (m) {/ * code * /}) (nó); ' – Alan
+1, nhưng ai cũng có thể giải thích tại sao nó lại hoạt động ?! –
@digorydoo Hàm được khai báo trong vòng lặp được bọc trong dấu ngoặc đơn, sau đó là một tập hợp các dấu ngoặc đơn hoạt động ngay lập tức để gọi hàm. Vì các biến được phạm vi đến hàm mà chúng được khai báo (hoặc phạm vi toàn cục nếu không được khai báo bên trong một hàm), giá trị của 'nó' trong mỗi lần lặp được gán cho biến' m' được phạm vi đến hàm được thi hành ngay. –