javascript - 在回调中定义后不在范围内的全局变量?

时间:2012-01-22 11:44:20

标签: javascript variables loops callback scope

每当我尝试运行类似下面的内容时,firebug告诉我“标记未定义”的行为“for(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
      }
  }
}

我甚至没有将“markers”作为参数传递给我的makeMarkersWithXMLinfo()函数。但它确实有效。这是怎么回事?日Thnx

2 个答案:

答案 0 :(得分:5)

您遇到的问题是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
    }
}

您的第二个示例是对其进行编码的正确方法(尽管我建议完全避免使用全局),因为只有在GET完成后才使用markers

答案 1 :(得分:1)

$.get是异步的,这意味着如果你在$.get之后立即调用某个东西,它的回调函数就不会被调用,你的全局仍然是未定义的。