如果您定义了如下函数:
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但未将xhr
设置为null
吗?
这个问题与XMLHttpRequest - freeing after use?类似,但我觉得它没有得到一个答案,说明该对象实际上处于垃圾收集将删除它的状态。
答案 0 :(得分:0)
不,你不应该将xhr设置为null。
在JavaScript中,一旦删除了对象的所有引用,就会发生GC。所以,只要你不做一些疯狂的事情,如:
fetchData.cache = xhr;
然后在代码中引用该值:
var data = fetchData.cache;
然后你不必担心做任何自己的事情。 GC会在适当的时候到达。
答案 1 :(得分:0)
我强烈建议您完全阅读 您链接的mozilla documentation:
分配您需要的内存, 使用分配的内存(读,写)和 在不再需要时释放已分配的内存。 第一部分和第二部分在所有语言中都是明确的。最后一部分在低级语言中是明确的,但主要隐含在JavaScript等高级语言中。
通过引用收集垃圾:
这是最天真的垃圾收集算法。该算法减少了#34的定义;不再需要对象" to"一个对象没有引用它的其他对象"。如果指向此对象的引用为零,则对象被视为可收集垃圾。在谈到周期时,有一个limitation。
标记和扫描算法:
该算法减少了&#34的定义;不再需要对象" to"一个物体无法到达"。该算法假定知道一组称为根的对象(在JavaScript中,根是全局对象)。垃圾收集器会定期从这些根开始,找到从这些根引用的所有对象,然后从这些根引用所有对象,等等。从根开始,垃圾收集器将找到所有可到达的对象并收集所有非对象可到达的物体。
结论:如果您的对象无法从任何地方访问(在退出函数的情况下),它将被垃圾回收。在高级语言中,您不必担心这一点。
编辑:感谢Roland Starke指出您可以阅读垃圾收集器如何处理XMLHttpRequest here的规范。