2

我有以下代码:

var address;
getAddress(0,0);
function getAddress(latlng) 
{
  if (latlng != null) 
  {
    geocoder.getLocations(latlng, 
    function(addresses) 
    {
      if(addresses.Status.code == 200) 
      { 
        address = addresses.Placemark[0].address.toString();
        alert(address);  // Outputs something :)
      }
    });
   }
   return address;   //returns nothing :(
}

address总是返回undefined,但警报确实输出了一些东西。为什么是这样?

(Geocoder 是Google Maps API的一个实例)

4

4 回答 4

3

我认为您的问题都与范围有关。一般来说,您不想依赖在函数范围内使用的变量的全局声明。

这应该更正您的函数的任何范围问题:

var address = getAddress(0,0);

function getAddress(latlng) {
    if (latlng != null) {
        var address = geocoder.getLocations(latlng, function(addresses) {
            if(addresses.Status.code == 200) { 
                return addresses.Placemark[0].address.toString();
            }
        });
    }
return address;
}
于 2008-11-26T16:15:30.880 回答
0

我通过将 geocoder.getLocations() 实现为异步成功地重现了该错误。如果 geocoder.getLocations() 只是简单地执行了参数函数,那么变量的更改将在 getAddress() 返回之前变得可见,因此这不是范围问题。

var address;
alert("B: address returned: " + getAddress());
function getAddress() {
  executeFunction(function() {
    address = "myAddress";
    alert("C: address set to: " + address);
  });
  return address;
}

function executeFunction(aFunction) {
  alert("A: executing: " + aFunction);
  window.setTimeout(aFunction, 1);
}

执行上面的代码会产生警报顺序 ABC,这意味着该地址在分配之前返回。替换为 ACB 顺序中window.setTimeout(aFunction, 1);aFunction()结果,最后一个警报是“B:返回的地址:myAddress”。

于 2008-11-26T17:09:30.287 回答
0

如果我没记错的话,它看起来像

geocoder.getLocations

不会返回一个值,但期望一个回调函数,在你的情况下:

function(addresses) {
    if(addresses.Status.code == 200) { 
        return addresses.Placemark[0].address.toString();
    }
}

这个“内部”返回不会有太大作用,因为它将返回到 geocoder.getLocations 的内部。

因此,执行分配的函数可能在外部返回之后被调用(回调和 200 状态表明涉及到缓慢的 http 调用)。

也就是说,除非您可以修改 geocoder.getLocations ,否则解决方案将是使您的函数也可以正常工作,例如:

function getAddress(latlng, callback) {
    if (latlng != null) {
        geocoder.getLocations(latlng, function(addresses){
            if(addresses.Status.code == 200) { 
                address = addresses.Placemark[0].address.toString();
                alert(address);
                //Outputs something :)
                callback(address);
            }
        });
    }

}

你会用类似这样的方式调用它:

getAddress(ll, function(address){
   alert(address);
});

作为奖励,您可以摆脱全局变量:-)

于 2008-11-26T16:26:29.080 回答
-4

我看不出这不起作用的任何原因。

为了确保没有返回任何东西使函数调用像这样

window.alert(getAddress(0,0));

然后看看输出了什么

于 2008-11-26T16:16:48.847 回答