具有范围的记忆力学

时间:2011-12-05 00:43:00

标签: javascript memory-management scope

如果我做的话

// global scope
function stuff() {
    // local scope
    var a = new SomeHugeMemoryHog();
}

// a doesn't exist down here, but what happened to the memory from the "stuff" scope?

如果我未在a = null范围的末尾设置stuff,是否会造成内存泄漏?或者我不应该担心吗?我问的是这个问题,重点是在函数范围内创建DOM个对象(例如canvas)(我以后不再使用它)。我只是使用画布来抓住矢量尺寸。

4 个答案:

答案 0 :(得分:3)

不,一旦没有更多的引用,就应该收集垃圾。

答案 1 :(得分:3)

正如其他人指出的那样,由于垃圾收集器不会在函数外部引用a,因此垃圾收集器很可能会在下一个集合中收集它。

然而,您需要注意的一些事情是间接捕获。这种情况发生的常见地方是事件处理程序通过闭包捕获。例如,

function stuff() {
    var a = new SomeLargeObject();
    $("#somediv").click(function () { /* something */ });
}

即使嵌套函数不使用a。由于a的激活记录仍然存在,stuff可能会保持活动状态。此外,DOM对象的收集方式可能与普通JavaScript对象的收集方式不同,这可能会导致它们容易受到导致收集问题的循环引用。这在旧版浏览器中最有问题,并且因为您使用支持画布的画布浏览器引用,往往更现代,并且正确处理循环引用以及允许闭包未捕获的局部变量。

答案 2 :(得分:1)

你不应该担心它。 a将是stuff()函数中的本地全局(并且对于运行“lower”的任何代码都是可见的,但在stuff()调用之外是不可见的。

e.g。

<script>
// a does not exist here

function stuff() {
   // no a here
   var a = new SomeHugeMemoryHog(); // a will be set once SomeHugeMemoryHog is created and the constructor returns
   // a exists here
}

// no a here either

stuff(); // a exists while stuff is running

// a has gone out of scope and will be cleaned up.

</script>

答案 3 :(得分:-1)

我可以看到可能的内存泄漏的唯一情况是当您的函数实际用作构造函数时。即

var someObj = new stuff();

否则,变量a将被垃圾收集。