我使用http://tile.cloudmade.com/wml/latest/web-maps-lite.js
进行地理编码。
地址数组包含大约20个addresess
addresses[n] = {where:where,who:who,contact:contact,note:note,type:type};
然后我将数组循环到地理编码
for (var i = 0; i < addresses.length; i++) {
geocoder2.getLocations(addresses[i].where, function(response) { //a callback
return function(k){
Lat[k] = response.features[0].centroid.coordinates[0];
Lng[k] = response.features[0].centroid.coordinates[1];
latlng = new google.maps.LatLng(Lat[k], Lng[k]);
MarkerArray[k] = new google.maps.Marker({
map: map,
position: latlng,
zIndex: k,
title: addresses[k].who,
icon: icons(addresses[k].type.trim())
});}(i) // a closure function called
});
}
但它始终适用于最终索引。为什么?
答案 0 :(得分:1)
你有闭包循环问题。您似乎试图通过添加return function(k)...
闭包来修复它,但这一切都发生在回调函数中,因此在循环退出并且i
指向其最终值之前它不会执行
您必须将该包装器推出一个级别,因此它直接位于循环内:
for (var i = 0; i < addresses.length; i++) {
geocoder2.getLocations(addresses[i].where, function(k) { //a callback
return function(response){
Lat[k] = response.features[0].centroid.coordinates[0];
Lng[k] = response.features[0].centroid.coordinates[1];
latlng = new google.maps.LatLng(Lat[k], Lng[k]);
MarkerArray[k] = new google.maps.Marker({
map: map,
position: latlng,
zIndex: k,
title: addresses[k].who,
icon: icons(addresses[k].type.trim())
});
}
}(i)); // binding *here* instead!
}
或使用Function#bind来避免嵌套函数。