2012-01-22 53 views
3

每當我嘗試運行下面這樣的東西時,螢火蟲告訴我「標記未定義」行(「var i = 0 ...」javascript - 回調中定義的全局變量不在範圍之內?

但我在上面聲明標記爲全局變量正確的...?

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

我甚至通過 「標記」 作爲參數傳遞給我的馬肯arkersWithXMLinfo()函數。但它的工作。這是怎麼回事? thnx

回答

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

你的第二個例子是編寫它的正確方法(雖然我建議完全避免一個全球性的),因爲你使用的markers GET完成之後。

+0

哇,這是有幫助的。謝謝!!! – gunit

+0

@GeorgeL :-)不用擔心,很高興幫助。因爲你是Stack Overflow的新手,所以我會告訴你:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

1

$.get是異步的,這意味着,如果你$.get後立刻打電話的東西,它的回調函數不會被調用還和全局仍然是不確定的。