Если я не ошибаюсь, это выглядит как
geocoder.getLocations
не вернет значение, но ожидает функцию обратного вызова, в вашем случае:
function(addresses) {
if(addresses.Status.code == 200) {
return addresses.Placemark[0].address.toString();
}
}
Это «внутреннее» возвращение мало что даст, так как будет возвращаться к внутренностям geocoder.getLocations.
Таким образом, функция, выполняющая присваивание, вероятно, вызывается позже, чем внешний возврат (обратный вызов и состояние 200 предполагают, что задействован медленный http-вызов).
То есть, если вы не можете изменить geocoder.getLocations, решением будет сделать вашу функцию тоже функциональной, что-то вроде:
function getAddress(latlng, callback) {
if (latlng != null) {
geocoder.getLocations(latlng, function(addresses){
if(addresses.Status.code == 200) {
address = addresses.Placemark[0].address.toString();
alert(address);
//Outputs something :)
callback(address);
}
});
}
}
и вы назовете это что-то вроде:
getAddress(ll, function(address){
alert(address);
});
И в качестве бонуса вы можете избавиться от глобальной переменной: -)