JavaScript父变量值不规则?

JavaScript父变量值不规则?,javascript,variables,function,Javascript,Variables,Function,我有以下代码: 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

我有以下代码:

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是

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

这将纠正与您的职能有关的任何范围问题:

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;
}

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

这将纠正与您的职能有关的任何范围问题:

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;
}

我看不出这有什么不起作用的原因

为了确保没有返回任何内容,函数调用如下所示

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

然后看看输出的是什么

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

为了确保没有返回任何内容,函数调用如下所示

window.alert(getAddress(0,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);
});
}

你可以这样称呼它:

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);
});

作为奖励,您可以去掉全局变量:-

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

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);
});
}

你可以这样称呼它:

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);
});

作为奖励,您可以去掉全局变量:-

通过将geocoder.getLocations实现为异步,我成功地再现了错误。如果geocoder.getLocations只是执行parameter函数,那么变量的更改将在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);
}

执行上述代码将导致警报顺序A-B-C,这意味着地址在分配之前返回。更换window.setTimeoutaFunction,1;函数结果的顺序为A-C-B,最后一个警报为B:address返回:myAddress。

我通过将geocoder.getLocations实现为异步,成功地再现了错误。如果geocoder.getLocations只是执行parameter函数,那么变量的更改将在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);
}

执行上述代码将导致警报顺序A-B-C,这意味着地址在分配之前返回。更换window.setTimeoutaFunction,1;函数结果的顺序为A-C-B,最后一个警报是B:address returned:myAddress。

这似乎是一种容易回答的方式,也可能是一种难以回答的方式:geocoder.getLocations是如何定义的?在不知道的情况下,很难说出需要做哪些更改。getAddress0,0不应该只有一个参数吗?getAddress[0,0]?这似乎是一种容易回答的方式,也可能是一种难以回答的方式:geocoder.getLocations是如何定义的?在不知道的情况下,很难说出需要做哪些更改。getAddress0,0不应该只有一个参数吗?getAddress[0,0]?有很多关于函数式javascript的阅读材料:有很多关于函数式javascript的阅读材料: