Что вам нужно сделать, это убедиться, что this
установлен правильно в обратном вызове. Это иногда называют «обязательным». Для этого Prototype предоставляет Function#bind
, но сделать это достаточно просто, если вы не используете Prototype & mdash; Определите функцию, которая будет выполнять связывание для вас:
function bind(context, func) {
return function() {
return func.apply(context, arguments);
}
}
, а затем используйте его в вашем initialize
звонке:
function initialize() {
var Place = new Location("Tokyo, Japan");
Place.geoCode(bind(Place, Place.geoCallback)); // <= Change is here
window.alert("Main lat: " + Place.coord[0] + " lon: " + Place.coord[1]);
}
(хотя я думаю, что я бы предложил немного изменить рефакторинг, чтобы вызывающий geoCode
не должен был обеспечивать обратный вызов на этом уровне.)
То, что bind
выше делает, - это создает замыкание (функцию), которое при вызове оборачивается и вызывает функцию, которую вы дали с this
, установленным в заданный вами контекст, передавая любые заданные аргументы. (Это делается выше с помощью Function#apply
, который является стандартной частью JavaScript.) Обычно вы бы хотели определить bind
на довольно высоком уровне (на уровне страницы или в вашей функции определения объема, если вы используете одну [которая является хорошая идея]), чтобы сгенерированные функции не закрывали больше данных, чем необходимо.
Вот пост в моем анемичном блоге о this
более подробно.
Относительно вашего редактирования: На самом деле это совершенно другой вопрос. По умолчанию Ajax-вызовы асинхронны (поэтому Google хочет, чтобы вы предоставили функцию обратного вызова). Таким образом, ваш код запрашивает данные через getLocations
, но этот запрос обрабатывается асинхронно, и ваш код продолжается. Следующее, что делает ваш код, это отображает значения, которых у вас еще нет. Через некоторое время запрос будет выполнен, а значения будут обновлены, но к тому времени ваш код завершится. Вы хотели бы переместить предупреждение (в более общем смысле, переместить код, обрабатывающий результат) в обратный вызов.