javascript - глобальная переменная не входит в область действия после определения в обратном вызове? - PullRequest
3 голосов
/ 22 января 2012

всякий раз, когда я пытаюсь запустить что-то вроде следующего, firebug говорит мне, что "маркеры не определены" в строке "для (var i = 0 ..."

, но я объявил маркеры как глобальную переменнуюв правом верхнем углу ...?

var markers;
function load() {

  $.get("phpsqlajax_genxml.php", function(data) {
    markers = data.documentElement.getElementsByTagName("marker");
  });

  for (var i = 0; i < markers.length; i++) {
    var name = markers[i].getAttribute("name")
    //do more stuff
    }
}

но когда я делаю это, это работает.

var markers;
function load() {

  $.get("phpsqlajax_genxml.php", function(data) {
      markers = data.documentElement.getElementsByTagName("marker");
      makeMarkersWithXMLinfo(); 
  });

  function makeMarkersWithXMLinfo() {
      for (var i = 0; i < markers.length; i++) {
             var name = markers[i].getAttribute("name")
             //do more stuff
      }
  }
}

я даже не пропускаю "маркеры"в качестве аргумента моей функции makeMarkersWithXMLinfo (), но все же она работает. что происходит? thnx

Ответы [ 2 ]

5 голосов
/ 22 января 2012

Проблема в том, что get запускает асинхронную операцию. Таким образом, ваш код сразу после вызова get происходит до успешного выполнения обратного вызова на get. Например. (см. комментарии):

var markers;
function load() {

  // ===> This happens FIRST
  $.get("phpsqlajax_genxml.php", function(data) {
    // ===> This happens THIRD, some time after `load` returns
    markers = data.documentElement.getElementsByTagName("marker");
  });

  // ===> This happens SECOND
  for (var i = 0; i < markers.length; i++) {
    var name = markers[i].getAttribute("name")
    //do more stuff
    }
}

Ваш второй пример - правильный способ его кодирования (хотя я бы рекомендовал полностью избегать глобализации), потому что вы используете markers только после завершения GET.

1 голос
/ 22 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...