2012-12-19 30 views
3

让我们说我有一个“神奇”的功能是这样的...(神奇加以说明)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,所以这可能没有多大意义。

+1

返回值不影响哪些变量超出范围(但仍然可以关闭它们并返回闭包)。 –

+1

请注意,在IIFE中设置'a = null'将导致点击处理程序中出现TypeError。 –

+1

我不认为环境是在这里玩的。除了通过事件处理程序之外,环境应该无法访问'a'或'z'。环境可能在收集分离节点(以及随后的处理程序和_只是then_'a')时发挥作用。只要节点被连接,即使你从'a'范围返回'null',也不能收集'a'。 –

回答

4

因为你已经将闭包函数绑定到了onclick。与'var a'相关联的内存将保留,直到您释放onclick处理程序。

  1. 即使您没有设置“风险价值”为空,以“风险价值”记忆联想应该是微不足道的“风险价值”只具有参考全局对象“改编”。
  2. 将'var z'设置为null不起作用。
  3. 如果你可以避免在你的关闭中使用'var a',那么'var a'将被释放。
  4. 点击发生时,函数会得到运行时错误,因为'var a'为空。
  5. 从函数中返回null在内存使用中没有意义。
+0

是的,会的。您最好放弃'var a'声明。 – closure

+0

感谢您的解释。我想,而不是'var a = arr'&'a.push(某事)'只是'arr.push(某事)'应该有所帮助? – Terry

+0

欣赏答案,再次感谢。 – Terry

相关问题