1

これが私のオブジェクトで、すべてのプロパティと関数を定義しましたが、それでもこのエラーが発生しますresult is not defined

これが私のコードです

var Xml = {
    to      : null,
    from    : null,
    url     : null,
    result  : null,  //<--- I defined result here

    init: function (fromaddress, toaddress, link) {
        from    = fromaddress;
        to      = toaddress;
        url     = link;

        this.requestXml();
        return this;
    },

    requestXml: function () {
        $.ajax({
            type: "GET",
            url: url,
            dataType: "xml",
            success: this.parseXml
        });
    },

    parseXml: function (xml) {
        console.log('xml: ' + $(xml));
        result = $(xml); //<--- Assigning value to result here
    },

    getResult: function () {
        console.log('Result: ' + result); // <--- Here is says result is not defined
        return result;
    }
};

どうすればこの問題を解決できますか?

アップデート

以下で getResult() を呼び出しています

var Route = {
fromurl : null,
tourl   : null,
from    : null,
to      : null,

init: function (fromaddress, toaddress) {
    from        = fromaddress;
    to          = toaddress;
    fromurl     = 'http://demo.com/url'+fromurl;
    tourl       = 'http://demo.com/url'+tourl;

    Route.searchRoute();
},

searchRoute: function () {
    var xml = Xml.init(from, to, fromurl);
    console.log(xml.getResult()); //<---- calling getResult();
}

 };
4

3 に答える 3

2

「装飾されていない」式は、持っていないresultという名前のグローバル変数を参照します。result

resultへの参照がテキスト上オブジェクトの内部にあるという理由だけで、その参照がそのオブジェクトのプロパティを参照していると仮定するのは正しくありません。他の言語ではそうかもしれませんが、JavaScript ではそうではありません。

問題の解決策は、質問へのコメントの 1 つにあります。this.これらの場合、プレフィックスとして使用すると機能します。このコードを試してください:

var x = 1;

var p = {
   x: 2,
   f: function () {alert(x); alert(this.x);}
}

p.f();

ここでは、1 が警告され、次に 2 が表示されます。

更新された質問への回答

ここにあるのは古典的な問題です。あなたが書く

var xml = Xml.init(from, to, fromurl);
console.log(xml.getResult()); //<---- calling getResult();

最初の行は最終的に Ajax リクエストを起動します。その要求が開始されると、すぐに 2 番目の行に移動し、そこで を呼び出しますxml.getResult()。Ajax 呼び出しが の値を入力できるようにgetResultなる前に、への呼び出しが行われる可能性はほぼ 100%ですresult

1 つの方法は、結果でやりたいことをinitメソッドに渡すことです。この場合、結果をログに記録したいようですので、試してみてください

var xml = Xml.init(from, to, fromurl, function () {console.log(xml.getResult()});

ここでは、新しい 4 番目のパラメーターがあるため、次のようにオブジェクトXml.initを更新して処理する必要がありXmlます (テストされていません)。

.
.
.
init: function (fromaddress, toaddress, link, callback) {
    from    = fromaddress;
    to      = toaddress;
    url     = link;

    this.requestXml(callback);
    return this;
},

requestXml: function (callback) {
    $.ajax({
        type: "GET",
        url: url,
        dataType: "xml",
        success: callback
    });
},

.
.
.

つまり、非同期呼び出しを行う場合は、すぐに結果を消費します。いつ「準備完了」になるかわからないため、後で保存しないでください。

于 2012-11-08T09:10:31.390 に答える
1

を使用する必要thisがありますが、コンストラクターを使用してすべてのメソッドのプロパティにアクセスできるようにすると、より簡単になる場合があります。

function Xml(to, from, url, result) {
  this.to      = to || null;
  this.from    = from || null;
  this.url     = url || null;
  this.result  = result || null;
  // init logic
}

Xml.prototype = {

  parseXml: function (xml) {
    console.log('xml: ' + $(xml));
    this.result = $(xml);
  },

  getResult: function () {
    console.log('Result: ' + this.result);
    return this.result;
  }

  ...

}

var xml = new Xml(to, from, url, result); // init

編集:オブジェクト リテラルは最適なオプションではない可能性があります。thisあなたのケースは、上記のようなコンストラクター、または混乱を避けたい場合はモジュールパターンに適しています:

function Xml() {

  var xml = {}
    , to = null
    , from = null
    , url = null
    , result = null;

  xml.parseXml = function( xml ) {
    ...
  };

  ...

  return xml;

}

var xml = Xml();
于 2012-11-08T09:15:06.447 に答える
0

試すXML.result

内外の議論と、それが別の時代を指しているものについては、 Javascript の「これ」を理解するを参照してください。this

于 2012-11-08T09:19:31.677 に答える