我遇到了问题。我一直在努力解决如何避免使用全局变量的问题。我决定使用一个带有函数的对象,并相应地编写一个脚本。但是,脚本将无法按预期运行:
GetXML: function() {
$.ajax({
type: "GET",
url: "questions.xml",
dataType: "xml",
success: function(xml) {
this.xml=xml;
$(window).trigger("canUseXML");
var docLength = $(xml).find('Question').length + 1;
alert("this really is an '" + this.xml + "' and the actual doclength is: " + docLength)//This is the first alert I mention.
} //close success
});//close AJAX
alert("yes! this is still a: " +this.xml) //This is the second alert I mention.
},
如果全部按预期运行,则两个警报都将导致“对象XMLDocument”(在此行的其他位置声明的变量:this.xml = null;
)。第一个按预期运行。但是,在该函数之外的第二个返回值“null”。为什么呢?
谢谢,Elliot Bonneville
P.S。我一直坚持看似简单的问题,即在函数之间传递变量一周。
答案 0 :(得分:2)
在JavaScript中,“this”总是指执行函数的“所有者”,或者更确切地说是指函数是其方法的对象。所以你的第一个和第二个“这个”并不是指同一件事。
假设“成功”函数在第二个警报之前执行(它可能没有)。你可以这样做:
GetXML: function() {
var that=this;
.
.
然后使用“that”而不是“this”。
答案 1 :(得分:1)
作用域。 一旦你走出匿名函数(xml),this.xml就不再存在了。
答案 2 :(得分:1)
你有两个问题:
范围界定:回调中的this
不是GetXML
作为成员的对象。在对象的构造函数中使用me = this;
之类的内容,然后使用me
代替this
来明确设置值。
您的回调函数等待您的Ajax请求成功,但脚本的其余部分正在进行,这是回调的目的。因此,发出Ajax请求,然后执行alert("yes! this is still a: " +this.xml)
,而回调尚未执行。
答案 3 :(得分:0)
这可能正在发生,因为ajax需要时间来处理。在执行下一个命令之前,Javascript不会等待一个请求,因此在调用AJAX时,它试图弄清楚this.xml发生了什么。