您需要在当前迭代期间生成一个匿名函数,以下应该修复它:
// note these are actual addresses in the real page
var addresses = new Array( "addr 1", "addr 2", "addr 3", "addr 4" );
for (var i = 0; i < addresses.length; i++) {
geocoder.getLatLng(addresses[i], function (current) {
return function(point) {
if (point) {
var marker = new GMarker(point);
map.addOverlay(marker);
map.setCenter(point, 13);
GEvent.addListener(marker, "click", function() {
// here, i=4
marker.openInfoWindowHtml("Address: <b>" + addresses[current] + "</b>");
});
}
}
}(i));
}
B//注意这些是真实页面中的实际地址
var 地址 = new Array( "addr 1", "addr 2", "addr 3", "addr 4" );
for (var i = 0; i
GEvent.addListener(marker, "click", function() {
// here, i=4
marker.openInfoWindowHtml("Address: <b>" + addresses[i] + "</b>");
});
}
});
}
进一步澄清
The getLatLng
Google 提供的方法使用 ajax 调用来获取特定地址的纬度和经度。由于这是一个异步调用并且不是当前线程的一部分,因此需要一个回调函数,该函数在 ajax 请求完成时调用。这是您指定为函数的第二个参数的匿名函数。
现在,在发出 ajax 请求的同时,您的代码继续运行,从而增加了i
每次循环遍历数组时。当您的第一个 ajax 调用返回时,循环已经增加到地址数组的长度 (4),因此当您的回调函数运行时,您将检索范围内的变量i
在它被循环增加之后。
通过我编写的修复程序,您将创建一个带有单个参数的匿名函数 -current
- 并返回前一个匿名函数i
变量替换为current
多变的。在循环的下一次迭代之前立即调用该函数,其中i
变量作为它的第一个参数。这将创建一个闭包,其当前值i
存储在current
调用函数时的变量。当我们提到current
变量稍后,我们得到存储的值i
.
我不太擅长解释这类事情,可能是因为我对它的理解不如js大神。更好地阅读有关 javascript 闭包的更多信息 http://www.jibbering.com/faq/faq_notes/closures.html.