Valore di ritorno dalla funzione nidificata in Javascript

Ho una funzione che è impostata come segue

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

Secondo la mia logica, quell’avviso dovrebbe restituire ‘pippo’, ma invece restituisce undefined. Che cosa sto facendo di sbagliato?

AGGIORNAMENTO : ecco il mio codice attuale (è una funzione per il geocoding inverso con l’API di Google)

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

    devi chiamare una funzione prima che possa restituire qualsiasi cosa.

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

    O:

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

    per il tuo codice attuale. Il ritorno dovrebbe essere all’esterno, nella funzione principale. Il callback è chiamato da qualche parte all’interno del metodo getLocations e quindi il suo valore di ritorno non viene ricevuto all’interno della funzione principale.

     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 } 

    Destra. La funzione passata a getLocations () non verrà chiamata fino a quando i dati non saranno disponibili, quindi restituire “country” prima che sia stato impostato non ti aiuterà.

    Il modo in cui devi fare ciò è di fare in modo che la funzione che passi a geocoder.getLocations () faccia effettivamente quello che volevi fare con i valori restituiti.

    Qualcosa come questo:

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

    Se si desidera eseguire qualcosa di diverso ogni volta che si ottiene la posizione, passare la funzione come parametro aggiuntivo a 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); 

    Se questo sembra un po ‘disordinato, allora potresti dare un’occhiata a qualcosa come la funzionalità Deferred in Dojo, che rende il concatenamento tra le funzioni un po’ più chiaro.

    Solo FYI, Geocoder è asincrono quindi la risposta accettata mentre logico in realtà non funziona in questa istanza. Preferirei avere un object esterno che funge da aggiornamento.

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