Что происходит, когда вы создаете каждое из своих обработчиков событий (функций):
new google.maps.event.addListener(the_marker, 'click', function() {
infowindow.open(map,the_marker);
});
... каждый из них получает постоянную ссылку на переменную the_marker
, , а не ее значение в момент создания замыкания. Поэтому все копии этой функции замыкания используют одно и то же значение (последнее значение, назначенное ему в цикле). Замыкания не сложны ( больше здесь ), но давайте просто скажем, что вы не первый человек, который совершил эту ошибку. :-) Это очень легко сделать.
Итак, вы хотите захватить значение из the_marker
на этой итерации цикла, что легко сделать:
new google.maps.event.addListener(
the_marker,
'click',
buildHandler(map, the_marker));
function buildHandler(map, marker) {
return function() {
infowindow.open(map, marker);
};
}
Там у нас есть функция, которая создает обработчик, используя аргументы, переданные в функцию, и мы вызываем эту функцию на каждой итерации цикла, чтобы создать наш обработчик для нас.
Этот ответ на другой вопрос о SO может помочь вам визуализировать, как замыкания получают доступ к переменным.