保持说没有定义结果属性。为什么?

时间:2012-11-08 09:07:31

标签: javascript jquery

这是我的对象,我已经定义了所有的属性和功能,但它仍然给我这个错误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();
}

 };

3 个答案:

答案 0 :(得分: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的调用将会发生的可能性接近100%。

一种方法是将您想要的内容与结果一起传递给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
    });
},

.
.
.

换句话说,当您打算进行异步调用时,立即使用结果。不要把它们保存起来以备日后使用,因为你永远都不知道他们什么时候会“准备好”。

答案 1 :(得分: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();

答案 2 :(得分:0)

尝试XML.result

请参阅Understanding "this" in Javascript,了解this的详细信息及其在不同时间的内容。