Неправильное значение родительских переменных JavaScript?

У меня такой код:

var address;
getAddress(0,0);
function getAddress(latlng) 
{
  if (latlng != null) 
  {
    geocoder.getLocations(latlng, 
    function(addresses) 
    {
      if (addresses.Status.code == 200) 
      { 
        address = addresses.Placemark[0].address.toString();
        alert(address);  // Outputs something :)
      }
    });
   }
   return address;   //returns nothing :(
}

address всегда возвращает undefined, но предупреждение что-то выводит. Почему это?

(Геокодер является экземпляром API Карт Google)

это кажется либо простым, либо сложным :(

Thomaschaaf 26.11.2008 18:59

Как определяется geocoder.getLocations? Не зная этого, очень сложно сказать, какие изменения вам нужно внести.

Illandril 26.11.2008 19:35

И не должен ли getAddress (0,0) иметь только один параметр? getAddress ([0,0])?

Victor 26.11.2008 19:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
5 571
4

Ответы 4

Я думаю, что все ваши проблемы связаны с размахом. Вообще говоря, вы не хотите полагаться на глобальное объявление переменной, которая будет использоваться в рамках функции.

Это должно исправить любые проблемы с областью действия вашей функции:

var address = getAddress(0,0);

function getAddress(latlng) {
    if (latlng != null) {
        var address = geocoder.getLocations(latlng, function(addresses) {
            if (addresses.Status.code == 200) { 
                return addresses.Placemark[0].address.toString();
            }
        });
    }
return address;
}

Я не вижу причин, по которым это не сработает.

Чтобы быть вдвойне уверенным, что ничего не вернет, вызовите функцию следующим образом

window.alert(getAddress(0,0));

А затем посмотрите, что выводится

Если не ошибаюсь, похоже

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

А в качестве бонуса можно избавиться от глобальной переменной :-)

Есть много материалов для чтения по функциональному javascript: google.com/search?q=functional+javascript

Victor 26.11.2008 19:47

Я успешно воспроизвел ошибку, реализовав асинхронную функцию geocoder.getLocations (). Если geocoder.getLocations () просто выполнит функцию параметра, то изменение переменной станет видимым до того, как getAddress () вернется, так что это не проблема области видимости.

var address;
alert("B: address returned: " + getAddress());
function getAddress() {
  executeFunction(function() {
    address = "myAddress";
    alert("C: address set to: " + address);
  });
  return address;
}

function executeFunction(aFunction) {
  alert("A: executing: " + aFunction);
  window.setTimeout(aFunction, 1);
}

Выполнение приведенного выше кода приводит к порядку предупреждений A-B-C, что означает, что адрес возвращается до его назначения. Замена window.setTimeout(aFunction, 1); на aFunction() приводит к порядку A-C-B, последним предупреждением является «B: возвращенный адрес: myAddress».

Другие вопросы по теме