Javascript-事件处理程序中的变量范围

Javascript-事件处理程序中的变量范围,javascript,event-handling,scope,Javascript,Event Handling,Scope,有人能澄清我对事件处理程序中变量作用域的理解吗?请看下面的代码: 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( {'addres

有人能澄清我对事件处理程序中变量作用域的理解吗?请看下面的代码:

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);
        });
}
var address=new Array();
地址[0]=“史密斯街1号”;
地址[1]=“史密斯街2号”;

for(var rownum=0;rownum
{'address':address[rownum]}
是一个对象文本。因此,它的值是在它所属的语句执行的准确时间确定的,将来对
address
rownum
的更改不会影响对象的
address
成员

您可能已经习惯于在闭包(引用父作用域变量的函数)中看到这个问题。这是一个完全不同的问题,因为函数体通常在一段时间后才会执行。这样的函数继续引用相同的变量,而不仅仅是相同的值

但在本例中,您根本没有在
for
循环中创建任何函数


不,
marker
变量仍将处于活动状态——这是闭包的一部分功能。如果您来自C背景,这看起来确实很神秘。外部函数已返回;其局部函数如何继续存在


答案是这些变量被匿名函数“封闭”,运行时会保留它们的存在,直到匿名函数不再被引用。

它没有遇到这个问题,因为您正在传递
地址[rownum]的值
在循环的每次迭代中都进入
geocode
函数。循环完成后,您没有引用
rownum
,这将导致您所说的问题。

将rownum索引从零开始

for(var rownum=0; rownum < address.length; rownum++)
{
        if(address[rownum])
                geocoder.geocode( {'address': address[rownum]}, geocodeCallBack);
}
for(var rownum=0;rownum
您的循环变量看起来不正确。顺便说一句,“是否应该用0实例化它,否则您将只在地址[1]处绘制标记”

“不显示'2 Smith Street'”?我…我看不出这里有什么问题…你在使用反向心理学吗?@Joseph-我本来希望两个标记都显示史密斯街2号。但是没有。为什么不呢?我在问题的末尾添加了额外的信息。我在额外信息中陈述的问题是否与你关于关闭的陈述有关?嘿,cdhowie,很抱歉再次打扰你…我知道了我没有完全理解你的答案,所以我问了一个相关的问题: