Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问其值在AJAX函数中设置的变量_Javascript_Jquery_Object_Methods_Global Variables - Fatal编程技术网

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

Javascript 访问其值在AJAX函数中设置的变量,javascript,jquery,object,methods,global-variables,Javascript,Jquery,Object,Methods,Global Variables,我有个问题。我一直在试图解决如何避免使用全局变量的问题。我决定使用一个带有函数的对象,并相应地编写了一个脚本。但是,脚本不会按预期运行: GetXML: function() { $.ajax({ type: "GET", url: "questions.xml", dataType: "xml", success: function(xml) { th

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

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.
    },
如果所有警报都按预期运行,则这两个警报都将产生“object XMLDocument”(此行中其他地方声明的变量:
this.xml=null;
)。第一次按预期运行。但是,该函数之外的第二个函数返回值“null”。为什么?

谢谢,埃利奥特·博纳维尔


另外,一周来,我一直在讨论在函数之间传递变量这一看似简单的问题。

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

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

范围界定。 一旦您离开匿名函数(xml),这个.xml就不再存在。

范围界定。 一旦您离开匿名函数(xml),this.xml就不再存在。

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

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

GetXML: function() {
 var that=this;
.
.
然后使用“that”而不是“this”。

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

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

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

然后用“那个”代替“这个”。

您有两个问题:

  • 作用域:
    回调中的此
    不是作为成员的
    GetXML
    对象。使用类似于
    me=this的东西,然后使用
    me
    而不是
    this
    来明确设置值

  • 回调函数等待Ajax请求成功,但脚本的其余部分仍在继续,这就是回调的目的。因此,发出Ajax请求,然后执行
    警报(“是的!这仍然是一个:”+this.xml)
    ,而回调尚未执行


  • 你有两个问题:

  • 作用域:
    回调中的此
    不是作为成员的
    GetXML
    对象。使用类似于
    me=this的东西,然后使用
    me
    而不是
    this
    来明确设置值

  • 回调函数等待Ajax请求成功,但脚本的其余部分仍在继续,这就是回调的目的。因此,发出Ajax请求,然后执行
    警报(“是的!这仍然是一个:”+this.xml)
    ,而回调尚未执行


  • 请用你正在使用的任何语言来标记这是什么语言?你应该把它放在标签里,让它清楚。此外,像“一个简单的逻辑错误”(例如,“我有一个错误”,“这里有一个问题”,“请修复我的代码”,等等)这样的标题并不能真正帮助未来的用户扫描相关文章的标题。我恭敬地建议使用更具描述性的标题(例如“访问在AJAX函数中设置值的变量”),感谢您的建议和礼貌的表达方式。以下建议。问题是否仅仅是第二个警报在AJAX调用完成并设置
    this.xml
    之前访问
    this.xml
    ?由于AJAX是异步的,第二个警报似乎需要推迟到调用确定完成为止。请使用您正在使用的任何语言对此进行标记。语言是什么?你应该把它放在标签里,让它清楚。此外,像“一个简单的逻辑错误”(例如,“我有一个错误”,“这里有一个问题”,“请修复我的代码”,等等)这样的标题并不能真正帮助未来的用户扫描相关文章的标题。我恭敬地建议使用更具描述性的标题(例如“访问在AJAX函数中设置值的变量”),感谢您的建议和礼貌的表达方式。以下建议。问题是否仅仅是第二个警报在AJAX调用完成并设置
    this.xml
    之前访问
    this.xml
    ?因为AJAX是异步的,所以第二个警报似乎需要推迟到调用确定完成时才发出。不,因为正如我前面所说的,这个变量在代码的前面声明过。作用域问题是此对象及其方法旨在防止的问题。是和否:
    this.xml
    确实存在,但匿名函数内部的
    this
    不同于它外部的
    this
    。是否提前声明它并不重要。函数内部和函数外部是不同的,真的吗?这解释了很多事情。不,因为正如我前面所说的,这个变量在代码的前面声明过。作用域问题是此对象及其方法旨在防止的问题。是和否:
    this.xml
    确实存在,但匿名函数内部的
    this
    不同于它外部的
    this
    。是否提前声明它并不重要。函数内部和函数外部是不同的,真的吗?这就解释了很多事情。当我声明“That”时,我在Firebug中得到了“missing:after property id”,我的警报不起作用。为什么?