Closure on a variable modified in loop of outer scope

0

Dlaczego pokazuje mi się taki błąd:

Closure on a variable modified in loop of outer scope

przy zmiennej j w linijce infowindow.open(map, markers[j]);

 $(window).load(function () {
            var j;
            for (j = 0; j < markers.length; j++) {
                google.maps.event.addListener(markers[j],
                    'click',
                    function() {
                        var contentString = 'Przykładowy napis';
                        var infowindow = new google.maps.InfoWindow({
                            content: contentString
                        });
                        infowindow.open(map, markers[j]);
                    });
                }
            });
0

A nie będzie przypadkiem tak, że jak funkcja zostanie wywołana, to zmienna j będzie miała wartość markers.length dla wszystkich markerów? Masz jedną zmienną j przechwyconą przez wszystkie funkcje, więc we wszystkich będziesz mieć jedną wartość.

Rozwiązaniem byłoby zdefiniowanie nowych zmiennych po jednej dla każdej iteracji:

 $(window).load(function () {
            var j;
            for (j = 0; j < markers.length; j++) {
                let index = j;
                google.maps.event.addListener(markers[index],
                    'click',
                    function() {
                        var contentString = 'Przykładowy napis';
                        var infowindow = new google.maps.InfoWindow({
                            content: contentString
                        });
                        infowindow.open(map, markers[index]);
                    });
                }
            });
0

Dzieki, pomogło. Czemu przy pomocy zwykłej zmiennej zamiast let nie działa?

0

bo jak masz var to jest tworzone wiązanie jedno na funkcję, więc zanim wywołają się funkcje, to j już będzie miało wartość maksymalną. Można tego uniknąć operując na let czy const, które tworzą wiązania blokowe (kiedyś się również tworzyło IIFE - tj. samowywołującą się funkcję, ale teraz zwykle const/let wystarczy).

1 użytkowników online, w tym zalogowanych: 0, gości: 1