【发布时间】:2011-10-23 13:51:22
【问题描述】:
有人可以澄清我对事件处理程序中变量范围的理解吗?看看下面的代码:
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);
});
}
对于大多数人来说,这段代码看起来很简单。它在谷歌地图上绘制了两个标记。当您单击第一个标记时,它会显示地址“1 Smith Street”。当您单击第二个标记时,它会显示地址“2 Smith Street”。
好的,我的问题是:为什么两个标记都不显示“2 Smith Street”?
过去,我循环遍历对象数组并将事件处理程序绑定到每个对象。在事件处理程序代码本身中,我会尝试重新引用数组中的相应对象,这超出了事件处理程序的范围。因此,在页面加载结束时,所有对象的事件处理程序都引用了循环中的 LAST 元素。为什么我上面的示例地理编码没有遇到同样的问题?
如果我没有很好地表达问题,请原谅我。是因为对情况很迷茫。我似乎无法用事件处理程序来了解变量范围......如果有人可以帮助我澄清,那就太好了。
其他信息/困惑
另一件事...变量var marker 在geocodeCallBack() 的范围内被实例化。当用户在运行期间触发google.maps.event.addListener(marker, 'click', function(){}) 时,标记不是销毁 吗?在这种情况下,我应该得到某种未定义的错误?
【问题讨论】:
-
"不显示'2 Smith Street'"?我……我没有看到这里的问题……你是在使用逆向心理学吗?
-
@Joseph - 我期待两个标记都显示 2 Smith Street。但事实并非如此。为什么不呢?
标签: javascript event-handling scope