2010-11-18 64 views
0

我遇到了问题。我一直在试图解决如何避免使用全局变量的问题。我决定改用一个带有功能的对象,并相应地编写一个脚本。然而,由于预期该脚本将不会运行:访问在AJAX功能中设置其值的变量

GetXML: function() { 
     $.ajax({ 
      type: "GET", 
      url: "questions.xml", 
      dataType: "xml", 
      success: function(xml) { 
       this.xml=xml; 
       $(window).trigger("canUseXML"); 
       var docLength = $(xml).find('Question').length + 1; 
       alert("this really is an '" + this.xml + "' and the actual doclength is: " + docLength)//This is the first alert I mention.   
      } //close success   
     });//close AJAX  

     alert("yes! this is still a: " +this.xml) //This is the second alert I mention. 
    }, 

如果都跑了预期,这两个警报将导致“对象的XMLDocument”(在这一行的其他地方声明的变量:this.xml = null;)。第一次按预期运行。但是,该函数之外的第二个函数返回值“null”。为什么?

Thanks,Elliot Bonneville

P.S.我一直被困在函数间传递变量一周的看似简单的问题上。

+2

请用任何您正在使用的语言对本标记进行标记 – 2010-11-18 23:02:59

+1

语言是什么?你应该把它放在标签中来说明。 – Dima 2010-11-18 23:03:50

+0

噢,对不起。 – 2010-11-18 23:11:24

回答

2

在JavaScript中,“this”总是指所执行函数的“所有者”,或者更确切地说,指的是函数作为方法的对象。所以你的第一个和第二个“这个”并不是指同一件事。

假设“成功”函数在第二次警报之前执行(它可能不会)。你可以这样做:

GetXML: function() { 
var that=this; 
. 
. 

然后用“that”而不是“this”。

+0

当我声明“那个”时,我在Firebug中“丢失了:属性ID后”并且我的警报不起作用。为什么会发生这种情况? – 2010-11-19 00:09:51

+0

还有谁知道? – 2010-11-19 01:23:21

0

这可能是因为ajax需要时间来处理。在执行下一个命令之前,Javascript并没有等待一个请求,所以当AJAX被调用时,它试图找出发生在这个.xml中的事情。

+0

如果你要投我的答案,请说明原因。 – 2010-11-22 02:11:04

1

范围界定。 一旦您在匿名函数(xml)之外旅行,this.xml不再存在。

+0

不,因为像我之前说过的那样,这个变量是在代码中早些时候声明的。范围问题是这个对象及其方法设计用来防止的问题。 – 2010-11-18 23:21:09

+0

是和否:'this.xml'确实存在,但匿名函数内的'this'与其外的'this'不同。 – Residuum 2010-11-18 23:33:58

+0

如果你提前声明它并不重要。这个功能和这个功能里面的功能是不同的。 – m4tt1mus 2010-11-18 23:34:37

1

你有两个问题:

  1. 作用域:this内回调是不是GetXML为成员的对象。在对象的构造函数中使用类似me = this;的东西,然后使用me而不是this来明确设置值。

  2. 您的回调函数等待您的Ajax请求成功,但脚本的其余部分正在进行,这是回调的目的。因此,Ajax请求已完成,然后您执行alert("yes! this is still a: " +this.xml),而回调尚未执行。

+0

啊......这很有道理。 – 2010-11-18 23:37:00