从Javascript中的嵌套函数返回值

我有一个function,设置如下

function mainFunction() { function subFunction() { var str = "foo"; return str; } } var test = mainFunction(); alert(test); 

根据我的逻辑,这个警报应该返回'foo',而是返回undefined。 我究竟做错了什么?

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

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

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

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

为您的实际代码。 回报应该在主要function之外。 callback在getLocations方法的某个地方被调用,因此它的返回值没有被接收到你的main函数中。

 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 } 

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

您需要这样做的方式是将您传递给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 } } 

如果每次获取位置时可能都想做一些不同的事情,则可以将该函数作为附加parameter passing给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特性,这使得函数之间的链接更清晰一些。

只是供参考,Geocoder是asynchronous的,所以接受的答案虽然逻辑在这种情况下不起作用。 我宁愿有一个外部的对象,作为你的更新。

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