0

別の javascript/jQuery の変数スコープに関する質問があります...

Container という名前のオブジェクトを宣言したとします。xml ファイルからアドレスを読み取る myimage という変数があります。

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

2つのアラートセクションをご覧ください。Container オブジェクトで定義したこの変数は、その readXML 関数内でのみ機能するようです。しかし、アウトではありません。なぜこれが起こったのか理解できません。

$.get 関数 var self= this; を実行する前に、this.myimage で宣言し、this の名前を self に変更してアクセスするなど、他の表記法を使用します。

しかし、それは悪化します。場合によっては、get 関数内で到達できなくなることさえあります。

これで私を助けてもらえますか?私の最終的な目標は、そのオブジェクトの配列であり、HTML に表示するよりも XML から大量のデータを読み取ることです。オブジェクトに設定した変数に到達できない場合、それを行う方法はありません。

ありがとうございました!!

4

2 に答える 2

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);
});​
于 2012-08-23T17:21:51.263 に答える
0

グローバル スコープで宣言されていない Javascript のすべての変数は、それらが宣言されている関数に対してローカルです。

関数は JavaScript のオブジェクトであるため、関数にプロパティを割り当てることができます。だから、あなたはすることができます

Container.myimage = $(xml).find('background').text();
//...
alert(Container.myimage);
于 2012-08-23T17:22:14.187 に答える