У вас проблема с закрытием j
.Когда ваша функция вызывается, j
будет ссылаться на последнее значение, которое j
имело в цикле for.Таким образом, j
будет lat.length
, что больше, чем circle
.Решение состоит в том, чтобы принудительно вычислять j
при генерации функции обратного вызова:
function make_callback(circle, map) {
return function() {
circle.setMap(map);
};
}
, а затем в цикле:
google.maps.event.addListener(marker[j], 'click', make_callback(circle[j], map));
Заключение процесса генерации обратного вызова в отдельную функциюдаст вам значение circle[j]
в момент вызова make_callback
, а не значение при вызове обратного вызова.
j
- это ссылка на значение, значение, на которое оно указываетзависит от того, когда вы спросите j
, каково его значение.Когда вы связываете функцию следующим образом:
google.maps.event.addListener(marker[j], 'click', function() { something(j); });
Анонимная функция не спрашивает j
, каково ее значение, до тех пор, пока функция не будет вызвана, функция просто запоминает, что она собирается использовать j
,Когда функция обратного вызова выполняется, она запросит j
его текущее значение и будет использовать его.Это означает две вещи:
- Все обратные вызовы, которые вы связали в этом цикле, будут использовать то же значение
j
. j
будет lat.length
, так как этопоследнее значение, которое j
было присвоено во время цикла.
Используя функцию make_callback
для построения обратных вызовов, мы запрашиваем j
его значение в то время, когда мы находимсяпривязка обратного вызова.Это просто стандартная уловка, заставляющая j
вычисляться, когда она имеет желаемое значение.