Javascript 如果XMLHttpRequestObject被删除和/或不包含任何值,那么AJAX如何做呢;s是否也设置为空?

Javascript 如果XMLHttpRequestObject被删除和/或不包含任何值,那么AJAX如何做呢;s是否也设置为空?,javascript,ajax,Javascript,Ajax,所以我正在读一本关于AJAX的书,他们在讨论如何使用内部函数来处理多个请求。我理解这一点,但在他们使用的这段代码中,我不理解变量XMLHttpRequestObject如何仍然可以使用: if(XMLHttpRequestObject) { XMLHttpRequestObject.open(“GET”, dataSource); XMLHttpRequestObject.onreadystatechange = function() { if (XM

所以我正在读一本关于AJAX的书,他们在讨论如何使用内部函数来处理多个请求。我理解这一点,但在他们使用的这段代码中,我不理解变量
XMLHttpRequestObject
如何仍然可以使用:

if(XMLHttpRequestObject) 
{
    XMLHttpRequestObject.open(“GET”, dataSource);

    XMLHttpRequestObject.onreadystatechange = function()
    {
        if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) 
        {
            document.getElementById(“targetDiv”).innerHTML = XMLHttpRequestObject.responseText;
            delete XMLHttpRequestObject;
            XMLHttpRequestObject = null;
        }
    }

    XMLHttpRequestObject.send(null);
}

我的第一个顾虑是,当他们删除
XMLHttpRequestObject
时,然后,在假定该对象被删除之后,他们将其设置为null。然后在假定它被删除并设置为null之后,他们使用
XMLHttpRequestObject.send(null)
但是当
XMLHttpRequestObject
被删除和/或不包含任何值,因为它也被设置为null时,它如何做呢?

创建
onreadystatechange
函数时不会立即执行。顾名思义,当状态发生变化时会调用它


在这种情况下,只有在XMLHttpRequestObject.readyState==4和XMLHttpRequestObject.status==200之后,即在成功接收页面之后,才会删除XMLHttpRequestObject。

它设置了一个在状态更改时调用的函数。不会立即调用,因此不会立即使用对象

事实上,您可以在内部使用XmlHttpRequestedObject是一些奇特的编译器技巧,基本上,它编写难看的代码来包装函数和变量

我的第一个顾虑是,当他们删除XMLHttpRequestObject,然后,在假定它被删除之后,他们将它设置为null

我不知道他们为什么这么做。设置为
null
对我来说已经足够了,但这可能解决了一些模糊的浏览器怪癖

然后在假定它被删除并设置为null之后,他们使用XMLHttpRequestObject.send(null)

否。删除发生在事件处理程序内部-只有在请求完成且xhr对象的状态发生更改(例如,由于服务器发送响应或通信中发生错误)后,才会调用此事件处理程序函数

基本上,调用序列与声明序列不同。调用顺序为:

XMLHttpRequestObject.open(“GET”, dataSource);
... //assign event handler so it can be called later on
XMLHttpRequestObject.send(null); 
... //request send, program continues


//separate context here, goes off when the readystate of the xhr changes
//due to server response or error:
function()
{
    if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) 
    {
        document.getElementById(“targetDiv”).innerHTML = XMLHttpRequestObject.responseText;
        delete XMLHttpRequestObject;
        XMLHttpRequestObject = null;
    }
}

好的,那么一旦成功接收到它,它如何不引发错误呢。删除XMLHttpRequestObject后,它仍然将其设置为null。与C++相比,JES中的删除关键字是否不同?@ JuST:在代码< >删除>代码>语句中发生的是,无论是什么对象引用的变量,都是用“代码> XMLHtRePyQuestObjestObj/Obj>”变量标记的,然后删除垃圾,最终将被垃圾收集。
null
赋值只是给变量
XMLHttpRequestObject
一个新值-
null
。所以变量
XMLHttpRequestObject
与对象不同-它只是用来保存对对象的引用,而
delete
作用于该对象,而不是变量。我以为JS有垃圾收集?为什么需要自己标记删除呢?Justen,JS确实有垃圾收集功能。但即便如此,你也可以通过明确地告诉机器你不再需要一个对象来提供帮助。我认为这就是这些路线的意图。此外,在f.e.InternetExplorer中还有一些已知的bug,它使用JS包装的主机对象表示,比如DOM和我相信XHR。请看:我认为这些话很可能是为了解决这个问题,因为它不会立即使用,但当它被使用时,我所有的问题都是一样的。