这是我的对象,我已经定义了所有的属性和功能,但它仍然给我这个错误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();
}
};
答案 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
的详细信息及其在不同时间的内容。