function initialize(final) {
/* ........ */
var address_array = final.split('~');
for (var count = 0; count < address_array.length; count++)
{
if (geocoder) {
geocoder.getLatLng(
address_array[count],
function (point) {
if (!point) {
alert(address_array[count] + " not found");
}
我想要的只是在这里工作的警报,在最后一行。
假设address_array
有3个值,即address_array.length
为3.但警报始终显示为undefined not found
。我假设无法从此函数访问address_array[count]
。但是当我尝试
alert(address_array.length + " not found");
它说3 not found
。请帮忙。
有人可以帮我解决这个问题吗?
function makeTheFunction(array,thisCount){ 返回函数(点){ if(!point){ alert(array [thisCount] +“not found”); }
else {
var marker = new GMarker(point);
map.addOverlay(marker);
GEvent.addListener(marker, "click", function () {
marker.openInfoWindowHtml(array[thisCount] + "</b>");
});
}
};
}
警报(数组[thisCount] +“未找到”);工作正常,但它进入其他部分似乎工作..marker.openInfoWindowHtml(array [thisCount] +“”);
答案 0 :(得分:5)
这是因为你的函数是count
变量的闭包,闭包得到持久引用到变量,而不是 copy 的值在定义函数时。因此,函数的所有副本在循环结束时都会看到count
,这超出了数组的范围 - 因此undefined
。
你想要做的是创建一个函数,使其关闭不会改变的东西。
var address_array = final.split('~');
for (var count = 0; count < address_array.length; count++)
{
if (geocoder) {
geocoder.getLatLng(
address_array[count],
makeTheFunction(address_array, count)
);
}
}
function makeTheFunction(array, thisCount)
{
return function(point) {
if (!point) {
alert(array[thisCount] + " not found");
}
};
}
我们将循环的每次迭代中的数组引用和count
值传递给makeTheFunction
,它将函数创建为对其参数的闭包并返回那个功能。现在该函数将显示正确的信息,因为它关闭的信息不会改变。请注意,如上所述,makeTheFunction
可以在任何其他函数之外,以避免闭包关闭其他任何函数。
有关闭包的更多信息:Closures are not complicated
答案 1 :(得分:1)
尝试:
function initialize(final) {
/* ........ */
var address_array = final.split('~');
for (var count = 0; count < address_array.length; count++)
{
doGeocode(address_array[count]);
}
}
function doGeocode(value){
if (geocoder) {
geocoder.getLatLng(
value,
function (point) {
if (!point) {
alert(value + " not found");
}
}
}
}