Javascript имеет языковую структуру, которая называется «замыкания». Замыкания - это функции (такие как function () {}, которые вы объявляете выше для работы с прослушивателем кликов), которые захватывают ссылки на внешние переменные.
Существует множество ресурсов, которые объясняют их лучше, чем я, и я предлагаю вам проконсультироваться, но вот моя лучшая попытка:
В этом блоке здесь:
google.maps.event.addListener(markers[key], 'click', function() {
infowindows[key].open(map, markers[key]);
});
Поскольку «ключ» уже определен как внешняя переменная, функция будет захватывать ссылку на эту переменную. Итак, где вы ожидаете:
infowindows["helloworld"]
Javascript вместо этого будет интерпретировать это как:
infowindows[reference to key]
Когда вы нажимаете на маркер, он ищет «ссылку на ключ», чтобы увидеть текущее значение ключа. Поскольку этого, вероятно, не произойдет до тех пор, пока ваш цикл не завершится, ключ будет равен любому последнему ключу в вашем объекте data.markers. И оно будет равно этому значению для КАЖДОГО прослушивателя кликов, который вы добавили.
Решение, как вы указали, заключается в том, чтобы обернуть это в анонимную функцию, чтобы Javascript оценивал значение «ключа» во время добавления прослушивателя щелчков.
google.maps.event.addListener(markers[key], 'click', function(innerKey) {
return function() {
infowindows[innerKey].open(map, markers[innerKey]);
}
}(key));