2011-06-24 75 views
0

我在这个QnA上看到过类似的线索,但我的具体情况如下。当Javascript对象从内存中被垃圾收集?

function render(canvas) { 
    var renderer = new Renderer(canvas); 
    renderer.render(); 
} 

Renderer.render()借鉴了<canvas>一些东西。现在事情是这样的,所以这意味着实例renderer不是垃圾收集。这让我想起我的问题 - renderer何时会被垃圾收集?请注意,除了通过自己的方法之外,此对象不会被其他地方引用。

我希望该对象在完成渲染时被垃圾回收。有什么办法可以强制吗?

+1

你怎么知道'renderer'是**不是**在函数超出范围后收集垃圾? –

+0

如果是这样,那么只要它超出范围就应该停止渲染。这实际上意味着它不可能提供任何东西。 – AppleGrew

+0

哦,是的,我应该补充一点,render()不会立即渲染。它对队列进行排序,并设置'setTimeout'来后续处理队列。这是一种避免浏览器在呈现时被锁定的技巧。 – AppleGrew

回答

0

您在render()中的超时持有对函数的引用,该函数继而保持对渲染器的引用。一旦超时执行完毕,并且没有设置更多的超时时间,就没有该函数的引用,并且没有对渲染器的引用,所以清楚地被垃圾收集。

+0

是的,我明白了。谢谢。 – AppleGrew

1

以v8的方式,没有对象的引用,并且javascript引擎变得闲置。

1

垃圾收集的细节未由ECMAScript规范定义,因此实现在不同的浏览器中有所不同,但通常在JavaScript中,当没有剩余引用时,对象可用于垃圾回收。

在你的例子的情况下,它将是当renderer声明返回的函数。

+0

'render'函数很可能是异步的,并启动一个新的线程或类似的东西。 –

+0

是的。这就是我问这个问题的原因。 – AppleGrew

+0

@Kerrek SB - 这是可能的,但在任何情况下,一旦没有引用保留到'renderer'对象,它就可用于垃圾收集。 –