2016-07-26 80 views
1

如果定义像函数:Ajax(XMLHttpRequest)对象在使用后是否清理?

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有garbage collector但是没有设置xhrnull伤害?

这个问题与XMLHttpRequest - freeing after use?类似,但我觉得它没有得到一个答案,说明该对象实际上处于垃圾收集将其删除的状态。

+1

这很可能是一个实现细节,因为我敢肯定规范没有说明会发生什么 –

+0

你会在哪里设置xhr为null?在readystate处理程序中将其设置为null就好比在你站在里面时试图炸毁buildini。 –

+0

一旦'callback'运行,就不再有'xhr'的引用,并且整个范围被收集。 – Brian

回答

0

我强烈建议您阅读完全你链接的mozilla documentation

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

垃圾收集的引用:

这是最天真的垃圾收集算法。这个算法减少了“不再需要一个对象”的定义到“一个对象没有其他对象引用它”。如果零引用指向此对象,则该对象被视为垃圾收集。当涉及到周期时,有一个limitation

马克 - 清除算法:

该算法减少了“的对象不需要了。”到“的对象是不可达”的定义。这个算法假设了一组被称为根的对象的知识(在JavaScript中,根是全局对象)。垃圾收集器将定期从这些根开始,找到从这些根引用的所有对象,然后从这些根引用所有对象,等等。从根开始,垃圾收集器将查找所有可到达的对象并收集所有非对象,可到达的对象。

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

编辑:谢谢Roland Starke指出你可以阅读垃圾回收器如何处理XMLHttpRequest here的规范。

0

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

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

fetchData.cache = xhr; 

然后在后面的代码是参考值:

var data = fetchData.cache; 

那么你不必担心做anythign你的自我。 GC会在它的时间到达。

+0

@RolandStarke当然可以。一切都是引用,只要对fetchData函数使用该变量的引用,并且xhr对象不能被垃圾收集。无论如何,问题的关键是要展示你如何解决问题,只要你不做任何不寻常的事情,你会没事的。 –

+0

你是正确的,不*所有*是参考原始类型是按值。对象将通过引用。更新我的答案,使其更清楚。 [https://jsfiddle.net/22xcchge/7/](https://jsfiddle.net/22xcchge/7/) –

相关问题