Tại sao các bạn nhận được cảnh báo
Như @RGraham nêu trong ý kiến, trình biên dịch js là giả định rằng tham số thứ hai để $.grep()
là một chức năng gọi lại và đang được thực hiện không đồng bộ (ít nhất đây là những gì nó trông giống như cú pháp). Tuy nhiên, điều đó không đúng vì hàm thứ hai thực tế là chức năng lọc . Xem API docs
Một thường nhận được cảnh báo Mutable Variable is accessible from closure
khi sử dụng hàm async
bên trong vòng lặp for. Thats bởi vì toàn bộ for loop
có một phạm vi. Điều đó có nghĩa là trên mỗi lần lặp lại, bạn sẽ kết thúc việc ghi lại cùng một biến. Vì vậy, các cuộc gọi lại sẽ nhận được các id sai, bởi vì level
(có thể thay đổi) sẽ được thay đổi trước khi gọi lại được gọi. May mắn thay, không thats trường hợp bạn đang đối phó với (vì $ .grep không phải là async) :)
... bạn có thể giải thích cho tôi nếu điều này thực sự sẽ ảnh hưởng đến cách mã của tôi sẽ thực hiện?
Không, cảnh báo đó sẽ không ảnh hưởng đến kết quả mã của bạn.
Bạn chỉ cần bỏ qua cảnh báo nhưng nếu bạn vẫn muốn tránh điều này, bạn có thể đặt nội dung bên trong một đóng.
for (x = 0; x < levels.length; x++) {
(function(){
var level = levels[x];
var candlesOnLevel = $.grep(relevantCandles, function(candles, index) {
return parseInt($(candles).css("top").replace(/px/, "")) === level;
});
})();
}
Cảnh báo bạn đang nhận được là gì? – Tushar
Mã của bạn là tốt. Trình biên dịch giả sử gọi lại được truyền vào '$ .grep' là không đồng bộ nhưng không phải. – CodingIntrigue
Cảnh báo chỉ là "Biến Mutable có thể truy cập từ đóng cửa", ty cho câu trả lời mặc dù! –