在回调函数之外使用全局变量的最佳方法是什么?
var icon;
$(function(){
$.get('data.xml', function(xml){
icon = xml.documentElement.getElementsByTagName("icon");
//this outputs a value
console.log(icon);
});
//this is null
//How can this maintain the value set above?
console.log(icon);
});
答案 0 :(得分:5)
您提供的代码完全有效 - 事实上,icon
“维持”它的价值。问题可能是get()
异步运行 - 只有在服务器上完全加载 'data.xml'
之后才调用匿名函数。所以现实世界的执行顺序看起来像这样:
get('data.xml', function(xml){...})
(开始加载data.xml)console.log(icon)
(此时icon
仍为空)icon = xml.documentElement.getElementsByTagName("icon")
。如果您希望在之后使用icon
,的值执行某些操作,那么您需要执行内部 / em>匿名回调函数。像这样:
var icon;
$(function(){
$.get('data.xml', function(xml){
icon = xml.documentElement.getElementsByTagName("icon");
console.log(icon);
});
});
祝你好运!
注意:您仍然可以使用来自外部匿名函数的代码中的icon
,但您需要等待访问它,直到之后匿名函数已经运行。执行此操作的最佳方法是将相关代码放入其自己的函数中,然后在回调函数中调用该函数:
var icon;
$(function(){
$.get('data.xml', function(xml){
icon = xml.documentElement.getElementsByTagName("icon");
loadIcon();
});
function loadIcon() {
console.log(icon);
// ... do whatever you need to do with icon here
}
});
答案 1 :(得分:1)
console.log(icon);
将没有值。移动处理回调函数中的响应的整个代码或它调用的函数。
$(function(){
$.get('data.xml', function(xml) {
var icon = xml.documentElement.getElementsByTagName("icon");
console.log(icon);
});
});
答案 2 :(得分:1)
问题是$.get
正在排队请求,但不会同步执行请求;它会立即返回。 JavaScript不是多线程的!
您必须在回调函数中执行console.log(icon)
。在执行该行时,AJAX调用尚未完成。
将从回调中设置全局icon
变量 ;你的代码在这方面是正确的。
答案 3 :(得分:1)
这样可以帮助可视化代码。
var icon;
$(function(){
$.get('data.xml', callback); // sends ajax request
// next line happens immediately unless ajax request is set to synchronous
console.log(icon); // logs undefined
});
function callback(xml){ // onsuccess callback happens
icon = xml.documentElement.getElementsByTagName("icon");
console.log(icon); // logs Array
}
我删除了匿名函数,并在console.log
之后放置了回调。像其他人一样指出ajax回调是异步发生的,而javascript继续执行。