在ajax回调函数之外使用变量

在回调函数之外使用全局变量的最佳方法是什么?

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

您提供的代码完全有效 – 事实上, icon 确实 “维持”它的价值。 问题很可能是get()以异步方式运行 – 只有 'data.xml'从服务器上完全加载后才调用匿名函数。 所以现实世界的执行顺序看起来像这样:

  1. call get('data.xml', function(xml){...}) (开始加载data.xml)
  2. call console.log(icon) (此时icon仍然为null)
  3. (data.xml完成​​加载) 现在调用匿名函数,它将值赋给icon: icon = xml.documentElement.getElementsByTagName("icon")

如果你想用icon的值做一些事情, 获取’data.xml’之后,你需要在匿名回调函数中进行。 像这样:

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

console.log(icon); 因为你正在做异步ajax,所以在这一点上没有值。 移动处理回调函数中响应的整个代码或调用它的函数。

 $(function(){ $.get('data.xml', function(xml) { var icon = xml.documentElement.getElementsByTagName("icon"); console.log(icon); }); }); 

问题是$.get正在排队请求,但不会同步执行请求; 它会立即返回。 JavaScript不是multithreading的!

您必须在回调函数中执行console.log(icon) 。 在执行该行时,AJAX调用尚未完成。

全局icon变量将从回调中设置; 你的代码在这方面是正确的。

它可以帮助像这样可视化代码。

  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继续执行。