У меня проблема с javascript, которая, по моему мнению, связана с замыканиями в циклах, подобных:
Как скопировать переменную в JavaScript?
Закрытие JavaScript внутри циклов - простой практический пример
Я строю список выводов на карте Bing и прикрепляю событие к каждому выводу, чтобы можно было отображать информационный блок для каждого вывода. Предполагается, что каждый контакт имеет отдельное информационное поле. Проблема состоит в том, что когда событие запускается, оно всегда отображает самое последнее информационное окно из последней итерации цикла, а не информационное окно, которое идет с выводом, запускающим событие. Вот метод с циклической конструкцией и моя неудачная попытка создать замыкание
monumentMap.plotData = function() {
monumentMap.theMap.entities.clear();
var monument = null
var loc = null;
for (var i = monumentMap.theData.length - 1; i >= 0; i--) {
monument = monumentMap.theData[i];
loc = new Microsoft.Maps.Location(monument.lat, monument.lon);
// construct a bing pushpin and add it to the item data
monument.pin = new Microsoft.Maps.Pushpin(loc, {
icon: 'http://media.maps101.com/' + monument.pinImg
});
// construct a bing infobox and add it to the item data
monument.infobox = new Microsoft.Maps.Infobox(loc, { // breakpoint 1
title: monument.title,
offset: new Microsoft.Maps.Point(-3, monument.pin.getHeight() - 5),
zIndex: 999,
visible: true
});
// add event listeners
// doesn't work
Microsoft.Maps.Events.addHandler(monument.pin, 'mouseover', function() {
return function(infobox) {
monumentMap.displayInfobox(infobox);
}(monument.infobox); // breakpoint 2: by the time this is executed monument.infobox is already "last not current"
});
// add the entities to the map view for this item
monumentMap.theMap.entities.push(monument.pin);
}
}
Мне трудно понять, почему это не работает. Я установил памятник выполняется до тех пор, пока не сработает событие) он ссылается на последний созданный мной информационный блок, а не на информационный блок, который я прикрепил к этому контакту при подключении обработчика события.
К этому моменту я наполовину ожидаю строку attributeMap.theMap.entities.push (museum.pin); , чтобы добавить связку копий последнего вывода в цикле, но это не так , Он работает так же, как и должен, и добавляет каждую булавку к каждой итерации цикла.