Javascript闭包和变量范围

Javascript闭包和变量范围,javascript,closures,Javascript,Closures,我正在扩展我的,因为我仍然不完全理解javascript闭包的概念。快速查看下面的代码,它将在地图上放置两个标记。(代码与我前面的问题略有修改) var-map=google.maps.somefunctioninstantimap(); var address=新数组(); 地址[0]=“史密斯街1号”; 地址[1]=“史密斯街2号”; 函数onpageload() { for(var rownum=0;rownumgeocode()在您将其声明为函数参数时重写numrow的值 for(var

我正在扩展我的,因为我仍然不完全理解javascript闭包的概念。快速查看下面的代码,它将在地图上放置两个标记。(代码与我前面的问题略有修改)

var-map=google.maps.somefunctioninstantimap();
var address=新数组();
地址[0]=“史密斯街1号”;
地址[1]=“史密斯街2号”;
函数onpageload()
{
for(var rownum=0;rownumgeocode()在您将其声明为函数参数时重写numrow的值

for(var rownum=0; rownum<=address.length; rownum++)
{
        geocoder.geocode( {'address': address[rownum]}, function(results, status) {geocodeCallBack(results,status,rownum)});
}

for(var rownum=0;rownum您似乎希望闭包结束某件事(它确实如此),但您没有使用它结束的任何东西(如循环索引)。您在
geocatecallback
中获得的
argnum
值来自谷歌(因为您已经将
rownum
定义为匿名函数的第三个参数,即循环计数器),所以它与循环计数器无关

关于该代码的其他几点:


你在顶部的循环是三次循环,而不是两次。你让它从
0
我认为这不可能是你真正的代码,尤其是因为你在顶部的
for
循环是三次循环,而不是两次循环。而且,你似乎不知从何处(无论如何,你显示的地方)提取了一个
map
变量.这缺少大量信息.“结果如何”什么?你给出了两个函数,没有调用任何一个函数,你引用了标记,没有任何解释。如果这看起来像谷歌地图,问题,而不是闭包。@T.J.Crowder-好的,我修复了这些错误…在我的真实代码中,我有这样的
geocoder.geocode({'address':address[rownum]},函数(结果,状态){geocodeCallBack(结果,状态,$('#行-'+rownum).val())}
。问题是rownum似乎总是值1。@约翰:该值来自谷歌,与循环计数器无关。您已经声明了
rownum
作为匿名函数接受的第三个参数,因此在匿名函数中,它将具有谷歌传递给回调的任何值作为第四个参数ird参数。除非您有意接收第三个参数,否则不要声明它。这样您就不会跟踪
rownum
——然后您就会遇到预期的问题,因为在调用函数时,
rownum
将是
2
,而不是
0
1
。而这将是我的答案r也是,我也找不到回调应该传递第三个参数的迹象。文档说它只传递了前2个参数。不知道这是否是未记录的参数。@T.J.-bah抱歉,匿名函数中不应该有任何第三个参数。我刚刚更正了注释。@John:我已经用我认为您正在寻找的内容更新了答案。如果他如果这样做,
geocodeCallback
将始终将
2
视为其第三个参数。绝对不是OP想要的。
for(var rownum=0; rownum<=address.length; rownum++)
{
        geocoder.geocode( {'address': address[rownum]}, function(results, status) {geocodeCallBack(results,status,rownum)});
}
geocoder.geocode( {'address': address[rownum]}, function(results, status, rownum) {geocodeCallBack(results,status,rownum)});
geocoder.geocode( {'address': address[rownum]}, geocodeCallBack);
geocoder.geocode( {'address': address[rownum]}, makeCallback(rownum));

function makeCallback(therow) {
    return function(results, status) {
        geocodeCallBack(results, status, therow);
    };
}
geocoder.geocode( {'address': address[rownum]}, makeCallback(rownum));

function makeCallback(therow) {
    return function(results, status) {
        geocodeCallBack(results, status, $('#row-' + therow).val());
    };
}