2010-11-18 45 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