让我们说我有一个“神奇”的功能是这样的...(神奇加以说明)JavaScript,内存泄漏,垃圾收集。试图简单的出路?
var arr = ['hello','I','am','in','an','array'];
(function() {
var z = document.getElementById('z');
//before edit: a = arr;
//let's leak memory... for fun!
z.onclick = function() {
var something = ...; //something, the uglier the better :P
//before edit: a.push(something);
arr.push(something);
something = null;
};
//now lets say by doing so I 'magically' fix my memory leak
//before edit: a = z = null;
z = null;
}());
但如果我这样做,而不是...
//instead of a = z = null;
return null;
通过将null调回到我的自我调用函数会标记垃圾收集的所有局部变量(a,z),还是会在浏览器中引用,从而仍占用内存?
注:我试图考虑传统的浏览器,如ie7等。另外,我在试着自学JavaScript,所以这可能没有多大意义。
返回值不影响哪些变量超出范围(但仍然可以关闭它们并返回闭包)。 –
请注意,在IIFE中设置'a = null'将导致点击处理程序中出现TypeError。 –
我不认为环境是在这里玩的。除了通过事件处理程序之外,环境应该无法访问'a'或'z'。环境可能在收集分离节点(以及随后的处理程序和_只是then_'a')时发挥作用。只要节点被连接,即使你从'a'范围返回'null',也不能收集'a'。 –