2012-05-24 46 views
2

我理解JavaScript中循環引用的概念以及避免它們阻止內存泄漏的重要性,但是我一直無法找到任何有關如何分配作爲閉包或原型成員函數的信息事件處理程序影響垃圾收集。事件處理程序分配和內存泄漏

例如假設我寫了下面的任一個:

var o = {}; 
o.var = 10000000; 
o.func = function() { /*Do something that does not involve o.var*/ }; 

function p() { } 
p.prototype.var = 100000; 
p.prototype.func = function() { /*Do something that does not involve p.var*/ }; 

...然後繼續做兩者之一:

var div = document.getElementByID('div'); 
div.onclick = o.func; 

var instance_of_p = new p(); 
var div = document.getElementByID('div'); 
div.onclick = instance_of_p.func; 

請問FUNC的分配()到一個DOM事件處理程序,防止整個對象被GC收集?

+0

這可能取決於引擎。由於'func'關閉了'o',它確實可以訪問它。儘管如此,一些引擎可能會認識到它不會訪問「o」。 –

+0

據我所知,它曾經發生在早期版本的IE中......而且你必須引用一個html元素,它引用了一個JS對象,它指向相同的html元素(?)...我' M不知道最後一個...... =) – benqus

+0

其實,我是故意這樣做的。雖然在這樣一個簡短的例子中看起來可能很愚蠢,但在我多次引用相同元素的很長一段代碼中,爲了易讀和高效,我會將它分配給一個變量。這個策略基於當我完成時GC收集變量,因爲它只被用於對DOM進行賦值而不被任何其他對象引用。如果這是一個不正確的陳述,我很想知道... – MadRabbit

回答