Функция geocoder.geocode
является асинхронной и получает широту и долготу внутри функции обратного вызова - после завершения асинхронной операции. Только тогда определяются переменные lat
и long
.
Ваше оповещение запускается сразу после запуска асинхронной операции, то есть оно еще не завершено к моменту срабатывания оповещения Итак, lat
и long
все еще не определены.
Вы не можете использовать широту и долготу за пределами блока обратного вызова. Переместите его внутрь блока обратного вызова, и он будет работать:
var address ="<%= params[:search] %>";
var lat;
var long;
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function(results, status) {
lat = results[0].geometry.location.lat();
long = results[0].geometry.location.lng();
// you can use lat and lng inside here! :)
alert(lat);
});
Прочтите этот пост, если вы хотите лучше понять асинхронный код в JavaScript: https://stackoverflow.com/a/14220323/2401947