Valor de retorno de la función anidada en Javascript [duplicado]

Esta pregunta ya tiene una respuesta aquí:

¿Cómo devuelvo una variable de la devolución de llamada del geocodificador JavaScript de Google Maps? 5 respuestas

Tengo una función que se configura de la siguiente manera

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

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

Según mi lógica, esa alerta debería devolver 'foo', pero en su lugar, regresa indefinido. ¿Qué estoy haciendo mal?

ACTUALIZAR: Aquí está mi código real (es una función para la geocodificación inversa con la API de 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;
    });   
   }

Respuestas a la pregunta(3)

Su respuesta a la pregunta