从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 - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]