【问题标题】:javascript - global variable not in scope after being defined in callback?javascript - 在回调中定义后全局变量不在范围内?
【发布时间】:2012-02-16 03:55:03
【问题描述】:

每当我尝试运行类似以下内容时,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
      }
  }
}

我什至没有将“标记”作为参数传递给我的 makeMarkersWithXMLinfo() 函数。但它仍然有效。这是怎么回事?谢谢

【问题讨论】:

    标签: javascript variables loops callback scope


    【解决方案1】:

    您遇到的问题是get 启动了一个异步 操作。因此,您的代码在调用get 之后立即发生在get 上的成功回调运行之前。例如。 (见 cmets):

    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。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多