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)
但是,当我这样做,它的工作原理.
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 } } }
我甚至没有将"markers"作为参数传递给我的makeMarkersWithXMLinfo()函数.但它确实有效.这是怎么回事?日Thnx
您遇到的问题是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完成后使用.