Может кто-нибудь прояснить мое понимание области видимости переменных в обработчиках событий?Взгляните на код ниже:
var address = new Array();
address[0] = '1 Smith Street';
address[1] = '2 Smith Street';
for(var rownum=0; rownum<=address.length; rownum++)
{
if(address[rownum])
geocoder.geocode( {'address': address[rownum]}, geocodeCallBack);
}
function geocodeCallBack(results, status)
{
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
title: results[0].formatted_address
});
google.maps.event.addListener(marker, 'click', function(){
var infowindow = new google.maps.InfoWindow({
content: marker.title
});
// how come this event handler knows the marker variable references the marker variable declared about 10 lines above?
infowindow.open(map, marker);
});
}
Для большинства людей этот код кажется простым.Он наносит два маркера на карты Google.Когда вы нажимаете на первый маркер, он показывает адрес «1 Smith Street».Когда вы нажимаете на второй маркер, он показывает адрес «2 Smith Street».
Хорошо, поэтому мой вопрос: почему оба маркера не показывают «2 Smith Street» ?
В прошлом я перебирал массивы объектов и привязывал обработчики событий к каждому объекту.В самом коде обработчика событий я бы попытался повторно ссылаться на соответствующий объект в массиве, который находится за пределами области действия обработчика событий.Таким образом, в конце загрузки страницы обработчик событий для ВСЕХ объектов ссылался на элемент LAST в цикле.Почему мой пример геокода, описанный выше, не сталкивался с той же проблемой?
Простите, если я плохо сформулировал проблему.Это потому, что очень запутался в ситуации.Кажется, я не могу обернуть голову вокруг переменной области видимости обработчиками событий ..... если кто-то может помочь мне прояснить, это было бы здорово.
Дополнительная информация / Путаница Другоевещь ... переменная var marker
была создана в области geocodeCallBack()
.Разве маркер не уничтожен к тому времени, когда пользователь запускает google.maps.event.addListener(marker, 'click', function(){})
во время выполнения?В каком случае я должен получить какую-то неопределенную ошибку?