以下哪个JavaScript代码段会泄漏内存?
摘录#1:
function foo(obj)
{
var obj2 = {};
$('#something').click(function() { alert(obj.id); } );
}
摘录#2:
function foo(obj)
{
var obj2 = {}
$('#something').click(function() { alert('obj was not used.'); } );
}
摘录#3:
function foo(obj)
{
var obj2= {id: 1}
bar(function() { alert(obj2.id); } );
}
function bar(func)
{
var obj3 = {};
func();
}
哪些变量不会被垃圾收集器收集? 如何修复泄漏?
答案 0 :(得分:3)
如上所述,这些都不会造成内存泄漏。
由于没有释放记忆而导致泄漏 - 一切都被释放。
顺便说一下,你所展示的代码都没有使用闭包。
现在,这里有一些"泄漏"可以创建。
// Simple leak -- an array that never lets go of memory
var arrayThatNeverShrinks = [];
function doleak() {
var s = "1234567890";
arrayThatNeverShrinks.push(s);
window.setTimeout(doleak, 500);
}
//start if off
doleak();
// This function leaks because bigVar is used -- and kept --
// inside of the anonymous function inside.
//Another leak, using closures
var leakingFunction = (function() {
var bigVar = "1234567890";
return function() {
alert("Hi there");
var keepBigVar = bigVar;
}
}());
答案 1 :(得分:2)
老问题,但我在评分最高的答案中有几个问题 -
顺便说一下,你所展示的代码都没有使用闭包
snippet one中的click处理程序非常关闭 - 它会关闭传递给foo的obj参数。因此,在用另一个对象再次调用foo之前,不会释放为obj分配的内存。
不是说这里有泄漏 - 只是想指出一个代码片确实创建了一个闭包。
此外,
由于没有释放记忆而导致泄密 - 一切都被释放
对于#2和#3的片段,情况确实如此,但对于片段#1则不然。