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 中则不然。

您的问题的解决方案是对该问题的评论之一。在这些情况下使用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 请求。一旦该请求被触发,您将立即转到您调用的第二行xml.getResult()您的Ajax调用能够getResult填充.result

一种方法是将您想要对结果执行init的操作传递给方法。在这种情况下,您似乎想要记录结果,因此请尝试

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

这里我们有一个新的第四个参数,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”,以讨论其中的来龙去脉this以及它指向不同时代的意义。

于 2012-11-08T09:19:31.677 回答