2012-08-23 55 views
0

我有另一個JavaScript/jQuery的變量範圍問題要求...:無法再訪問該函數嗎?

說我聲明瞭一個名爲Container的對象。其中有一個名爲myimage的變量,它將從某個xml文件中讀取地址。

Container = function() 
{ 
    var myimage; 
} 

Container.prototype.readXML = function() 
{ 
    $.get("assest/xml/images.xml",function(xml) 
{ 
    //Read in URL path from XML file, and store them into memeber variables 
    myimage = $(xml).find('background').text(); 
    //Apply background image into body, and apply css styple into it 
    $("body").css('background-image','url(' + myimage + ')'); 
      //This alert will work 
      alert(myimage); 
}); 
      //This alert gives not defined variable 
    alert(myimage); 
    } 

請看看兩個警報部分。看來這個變量我在Container對象中定義,只能在readXML函數內部工作。但沒有出。我無法理解爲什麼會發生這種情況。

我使用一些其他的符號,就像 this.myimage 並通過這種改變名稱自我訪問它宣佈之前執行$不用彷徨功能 無功自我=這一點;

但它變得更糟。有時它甚至不能在get函數中達到。

你能幫我解決嗎?我的最終目標是在該對象中創建一個數組,並從XML中讀取大量數據,而不是將它們顯示爲HTML。如果我在對象中設置的變量無法達到,我無法做到這一點。

謝謝!

+0

在你的「的ReadXml()」功能,即「MYIMAGE」變量** **不能在構造函數中聲明的局部變量 - 相反,這是一個全球** **變量。您的第二次警報不起作用的原因是該變量在ajax調用完成之前未定義。 – Pointy

回答

1
Container = function() 
{ 
    var myimage; 
} 

應該最有可能定義如下。更重要的是,$.get異步所以你不能假定它按照它寫的順序完成每行代碼

var Container = function() 
{ 
    this.myimage = ''; 
} 

Container.prototype.readXML = function(callback) { 
    $.get("assest/xml/images.xml", function(xml) { 
     //Read in URL path from XML file, and store them into memeber variables 
     this.myimage = $(xml).find('background').text(); 
     //Apply background image into body, and apply css styple into it 
     $("body").css('background-image', 'url(' + this.myimage + ')'); 
     //This alert will work 
     callback(this.myimage); 
    }); 
}​ 

var instance = new Container(); 
instance.readXML(function (copy) { 
    alert(copy); 
});​ 
+0

在回調中對「myimage」的引用應該是通過「this」副本的引用。 – Pointy

+0

爲清晰和功能而編輯。 – Joe

0

在Javascript中所有變量都沒有在全球範圍內聲明的是局部的,他們在聲明的功能。

因爲函數是在JavaScript對象,你可以分配的屬性給他們。所以,你可以做

Container.myimage = $(xml).find('background').text(); 
//... 
alert(Container.myimage);