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

Mik*_*ike 2 javascript ajax jquery

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

    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);
    });
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 6

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

  1. 调用get('data.xml', function(xml){...}) (开始加载data.xml)
  2. 调用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);
   });
});
Run Code Online (Sandbox Code Playgroud)

祝好运!


注意:您仍然可以使用匿名函数之外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
   }
});
Run Code Online (Sandbox Code Playgroud)