【问题标题】:Accessing a variable whose value is set in an AJAX function访问其值在 AJAX 函数中设置的变量
【发布时间】:2011-05-12 08:32:11
【问题描述】:

我有一个问题。我一直在尝试解决如何避免使用全局变量的问题。我决定改用一个带有函数的对象,并相应地编写了一个脚本。但是,脚本不会按预期运行:

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”。为什么?

谢谢,艾略特·邦纳维尔

附:在函数之间传递变量这个看似简单的问题上,我已经坚持了一周。

【问题讨论】:

  • 请用您使用的任何语言标记它
  • 语言是什么?您应该将其放入标签中以使其清楚。
  • 此外,诸如“一个简单的逻辑错误”之类的标题(例如“我有一个错误”、“这是一个问题”、“请修复我的代码”等)并没有真正有助于 SO未来的用户扫描相关文章的标题。我恭敬地建议使用更具描述性的标题(例如“访问其值在 AJAX 函数中设置的变量”)
  • 感谢您的建议和礼貌的表达方式。遵循建议。
  • 问题仅仅是在 AJAX 调用完成并设置 this.xml 之前第二个警报正在访问 this.xml 吗?由于 AJAX 是异步,因此似乎需要将第二个警报推迟到确定调用完成为止。

标签: javascript jquery object methods global-variables


【解决方案1】:

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

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

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

然后用“that”代替“this”。

【讨论】:

  • 当我声明“that”时,我在 Firebug 中得到“missing : after property id”并且我的警报不起作用。为什么会发生这种情况?
【解决方案2】:

范围界定。 一旦您在匿名函数(xml)之外旅行,this.xml 将不再存在。

【讨论】:

  • 不,因为就像我之前说的,这个变量是在代码的前面声明的。范围问题是此对象及其方法旨在防止的问题。
  • 是与否:this.xml 确实存在,但匿名函数内部的this 与外部的this 不同。
  • 提前声明也没关系。函数内的this和函数外的this是不同的。
  • 真的吗?这解释了很多事情。
【解决方案3】:

你有两个问题:

  1. 作用域:回调内部的this 不是您的对象,GetXML 作为成员。在对象的构造函数中使用me = this; 之类的内容,然后使用me 而不是this 来显式设置值。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 如果您要否决我的回答,请说明原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多