Ajax(XMLHttpRequest)对象在使用后进行清理

Does Ajax (XMLHttpRequest) objects cleanup after use?

本文关键字:XMLHttpRequest 对象 Ajax      更新时间:2023-09-26

如果您定义了一个函数,如:

function fetchData(callback) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if(xhr.readystate === 4 && xhr.status === 200) {
            callback(xhr.responseText);
        }
    };
    xhr.open('GET', 'http://example.com/', true);
    xhr.send();
}

现在想象一下我经常运行fetchData函数。

所以问题是,在回调执行后,我是否需要/应该运行xhr = null;

我知道JavaScript有一个垃圾收集器,但不将xhr设置为null会有伤害吗?

这个问题类似于XMLHttpRequest-使用后释放?但我觉得它没有得到一个答案来解释对象实际上处于这样一种状态,即垃圾回收将删除它。

我强烈建议您阅读全部您链接的mozilla文档:

分配您需要的内存,使用分配的内存(读、写)不再需要时释放分配的内存。第一部分和第二部分在所有语言中都是明确的。最后一部分在低级语言中是显式的,但在JavaScript等高级语言中大多是隐式的。

引用垃圾收集:

这是最幼稚的垃圾收集算法。该算法将"不再需要对象"的定义简化为"对象没有其他对象引用"。如果一个对象没有指向该对象的引用,则该对象被认为是可垃圾收集的。周期是有限制的。

标记和扫描算法:

该算法将"不再需要对象"的定义简化为"无法访问对象"。该算法假定一组称为根的对象的知识(在JavaScript中,根是全局对象)。垃圾收集器将定期从这些根开始,查找从这些根引用的所有对象,然后查找从这些引用的所有物体,等等。因此,从根开始,垃圾收集器将查找所有可到达的物体并收集所有不可到达的物质。

结论:如果您的对象在任何地方都无法访问(在您退出函数的情况下),那么它将被垃圾收集。这在更高级别的语言中是不必担心的。

编辑:感谢Roland Starke指出,您可以在这里阅读垃圾收集器如何处理XMLHttpRequest的规范。

不,您不应该将xhr设置为null。

在JavaScript中,一旦删除了对对象的所有引用,就会发生GC。所以,只要你不做一些疯狂的事情,比如:

fetchData.cache = xhr;

随后在代码参考中,该值为:

var data = fetchData.cache;

那你就不用担心做任何事情了。GC会在它的时间到达。