访问其值在AJAX函数中设置的变量

时间:2010-11-18 23:01:18

标签: javascript jquery object methods global-variables

我遇到了问题。我一直在努力解决如何避免使用全局变量的问题。我决定使用一个带有函数的对象,并相应地编写一个脚本。但是,脚本将无法按预期运行:

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。我一直坚持看似简单的问题,即在函数之间传递变量一周。

4 个答案:

答案 0 :(得分:2)

在JavaScript中,“this”总是指执行函数的“所有者”,或者更确切地说是指函数是其方法的对象。所以你的第一个和第二个“这个”并不是指同一件事。

假设“成功”函数在第二个警报之前执行(它可能没有)。你可以这样做:

GetXML: function() {
 var that=this;
.
.

然后使用“that”而不是“this”。

答案 1 :(得分:1)

作用域。 一旦你走出匿名函数(xml),this.xml就不再存在了。

答案 2 :(得分:1)

你有两个问题:

  1. 范围界定:回调中的this不是GetXML作为成员的对象。在对象的构造函数中使用me = this;之类的内容,然后使用me代替this来明确设置值。

  2. 您的回调函数等待您的Ajax请求成功,但脚本的其余部分正在进行,这是回调的目的。因此,发出Ajax请求,然后执行alert("yes! this is still a: " +this.xml),而回调尚未执行。

答案 3 :(得分:0)

这可能正在发生,因为ajax需要时间来处理。在执行下一个命令之前,Javascript不会等待一个请求,因此在调用AJAX时,它试图弄清楚this.xml发生了什么。