从Javascript中的嵌套函数返回值[重复]

Posted

技术标签:

【中文标题】从Javascript中的嵌套函数返回值[重复]【英文标题】:Return value from nested function in Javascript [duplicate] 【发布时间】:2011-02-06 09:45:06 【问题描述】:

我有一个功能设置如下

function mainFunction() 
      function subFunction() 
            var str = "foo";
            return str;
      


var test = mainFunction();
alert(test);

按照我的逻辑,该警报应该返回“foo”,但它返回的是未定义的。我做错了什么?

更新:这是我的实际代码(这是一个使用 Google API 进行反向地理编码的函数)

function reverseGeocode(latitude,longitude)
    var address = "";
    var country = "";
    var countrycode = "";
    var locality = "";

    var geocoder = new GClientGeocoder();
    var latlng = new GLatLng(latitude, longitude);

     return geocoder.getLocations(latlng, function(addresses) 
     address = addresses.Placemark[0].address;
     country = addresses.Placemark[0].AddressDetails.Country.CountryName;
     countrycode = addresses.Placemark[0].AddressDetails.Country.CountryNameCode;
     locality = addresses.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
     return country;
    );   
   

【问题讨论】:

我推荐阅读 javascript 闭包的工作原理:jibbering.com/faq/faq_notes/closures.html#clClose 【参考方案1】:

你必须调用一个函数才能返回任何东西。

function mainFunction() 
      function subFunction() 
            var str = "foo";
            return str;
      
      return subFunction();


var test = mainFunction();
alert(test);

或者:

function mainFunction() 
      function subFunction() 
            var str = "foo";
            return str;
      
      return subFunction;


var test = mainFunction();
alert( test() );

为您的实际代码。返回应该在外部,在主函数中。回调在 getLocations 方法内的某处被调用,因此它的返回值不会在您的主函数内收到。

function reverseGeocode(latitude,longitude)
    var address = "";
    var country = "";
    var countrycode = "";
    var locality = "";

    var geocoder = new GClientGeocoder();
    var latlng = new GLatLng(latitude, longitude);

    geocoder.getLocations(latlng, function(addresses) 
     address = addresses.Placemark[0].address;
     country = addresses.Placemark[0].AddressDetails.Country.CountryName;
     countrycode = addresses.Placemark[0].AddressDetails.Country.CountryNameCode;
     locality = addresses.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
    );   
    return country
   

【讨论】:

我已经用实际代码更新了我的问题。我遇到的问题是我正在使用 Google API,因此我的子函数被他们的一个函数调用。有什么想法可以解决吗? 谢谢。问题在于,当我简单地输入返回国家时;它返回“”,因为我通常没有足够快地从谷歌收到信息。有没有办法让它等到值改变? @chris 我认为使用这些 API 的更好方法是把你的逻辑(你想对国家做的事情,地址..)放在回调中。 你错过了我最喜欢的替代品return (funtion()...)(); getLocations 是异步的。该代码无法运行。【参考方案2】:

没错。在数据可用之前,您传递给 getLocations() 的函数不会被调用,因此在设置之前返回“国家”对您没有帮助。

您需要这样做的方法是让您传递给 geocoder.getLocations() 的函数实际上对返回的值执行您想要执行的任何操作。

类似这样的:

function reverseGeocode(latitude,longitude)
  var geocoder = new GClientGeocoder();
  var latlng = new GLatLng(latitude, longitude);

  geocoder.getLocations(latlng, function(addresses) 
    var address = addresses.Placemark[0].address;
    var country = addresses.Placemark[0].AddressDetails.Country.CountryName;
    var countrycode = addresses.Placemark[0].AddressDetails.Country.CountryNameCode;
    var locality = addresses.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
    do_something_with_address(address, country, countrycode, locality);
  );   


function do_something_with_address(address, country, countrycode, locality) 
  if (country==="USA") 
     alert("USA A-OK!"); // or whatever
  


如果您可能希望每次获取位置时都做一些不同的事情,那么将该函数作为附加参数传递给 reverseGeocode:

function reverseGeocode(latitude,longitude, callback)
  // Function contents the same as above, then
  callback(address, country, countrycode, locality);

reverseGeocode(latitude, longitude, do_something_with_address);

如果这看起来有点乱,那么您可以看看 Dojo 中的 Deferred 功能,它使函数之间的链接更加清晰。

【讨论】:

谢谢,但是我遇到的问题是我想在我的代码中多次使用 reverseGeocode。我有一个状态更新列表及其从 twitter API 返回的位置,因此我想为每个更新调用 reverseGeocode。另外,我想为当前用户的位置调用 reverseGeocode。不确定这是否有意义......如果你想看看我的意思,该网站位于chris-armstrong.com/whispers 如有疑问,请使用更多功能:-) 请参阅上面的编辑...【参考方案3】:

仅供参考,Geocoder 是异步的,因此在这种情况下,接受的答案虽然合乎逻辑,但实际上并不适用。我希望有一个外部对象充当您的更新程序。

var updater = ;

function geoCodeCity(goocoord)  
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode(
        'latLng': goocoord
    , function(results, status) 
        if (status == google.maps.GeocoderStatus.OK) 
            updater.currentLocation = results[1].formatted_address;
         else 
            if (status == "ERROR")  
                    console.log(status);
                
        
    );
;

【讨论】:

以上是关于从Javascript中的嵌套函数返回值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从javascript中的函数返回值[重复]

javascript - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]

无法从从 sql 数据库读取的 javascript 函数中获取返回数组 [重复]

函数——基本语法,嵌套匿名高阶递归函数

从JavaScript中的多个函数返回结果[重复]

C语言-函数