你需要生成當前迭代過程的匿名函數,下面應該修復它:
// 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));
}
乙//注意這些都是在現實頁面實際地址 VAR地址=新的Array(「地址1「,」addr 2「,」addr 3「,」addr 4「);
爲(VAR I = 0;我< addresses.length;我++){ geocoder.getLatLng(地址[I]中,函數(點){ 如果(點){ VAR標記=新的GMarker(點) ; map.addOverlay(標記); map.setCenter(點,13);
GEvent.addListener(marker, "click", function() {
// here, i=4
marker.openInfoWindowHtml("Address: <b>" + addresses[i] + "</b>");
});
}
});
}
進一步明確
的0 Google提供的方法使用ajax調用獲取特定地址的經緯度。由於這是一個異步調用,並且不是當前線程的一部分,因此需要一個回調函數,在完成ajax請求時調用該函數。這是您指定爲函數的第二個參數的匿名函數。
現在,在進行ajax請求的同時,您的代碼將繼續運行,每次循環遍歷數組時,都會增加i
的值。當你的第一個Ajax調用返回時,循環已經增加到了地址數組(4)的長度,所以當你的回調函數運行時,你將在循環增加後檢索範圍內的變量i
。
隨着我寫此修復程序,要創建一個匿名函數,它接受一個參數 - current
- 並返回與i
變量與current
變量取代了以往匿名函數。該函數在循環的下一次迭代之前立即被調用,其變量爲i
,因爲它是第一個參數。這將創建一個閉包,在該函數被調用時,i
的當前值將被存儲在current
變量中。當我們稍後參考current
變量時,我們得到的存儲值爲i
。
我不是很善於解釋這些事情,可能是因爲我對它的理解不如js神。更好地閱讀some more info on javascript closures。
我用一點解釋更新了我的答案。當我提供我的答案時,我的意思是寫更多,但我不得不去想,最好至少提供一個解決方案。 – 2010-01-19 22:02:03