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

gun*_*nit 3 javascript variables scope loops callback

每当我尝试运行类似下面的内容时,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
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做,它的工作原理.

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
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 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
    }
}
Run Code Online (Sandbox Code Playgroud)

你的第二个例子是正确的编码方式(尽管我建议完全避免使用全局),因为你markers只在GET完成后使用.