2010-01-18 47 views
5

我要保持一個JavaScript對象與一些30-40的屬性,我每隔幾秒鐘更新。我已經讀過,在JavaScript中沒有「釋放」內存這樣的事情,並且瀏覽器自動垃圾收集未使用的內存。JavaScript對象:摧毀他們

我的問題是:是否有足夠的設定對象本身爲空,或者我需要設置其所有屬性設置爲null,然後將其設置爲null?

var obj = []; 
obj[prop1] = "123"; 
obj[prop2] = "456"; 
//...and so on... 

// now to release the obj, is it enough if I just did: 
obj = null; 
+0

http://stackoverflow.com/questions/864516/what-is-javascript-garbage-collection – Eineki

回答

1

一個目的,如果它不再可達只能被收集。您可以通過設置引用該對象null所有局部變量實現這一目標(任何其他值會做的一樣好)和刪除(或重寫),它引用它的其他對象的任何屬性。

刪除對象自己的屬性或明確地將它們設置爲null在這方面不會帶來任何好處:如果對象的引用不是「活着的」,如果它本身不是。

+0

完美!謝謝! – Dmitry

0

將屬性設置爲null是不必要的。存儲在屬性中的任何值都將被垃圾收集器釋放。作爲替代,所述操作者delete將可能迫使立即銷燬:

delete obj; 
+2

'delete'不強制物件破壞 - 它從對象中刪除屬性;另外,局部變量不能被刪除;這樣做,即使是一個語法錯誤,嚴格模式的ECMAScript 5 – Christoph

1

在需要設置項目到null的唯一時間(我能想到的)是涉及DOM的一些情況。例如,如果您有一個包含多個子節點的節點,並且每個節點都有一個由匿名函數定義的onclick處理函數,那麼將每個onclick設置爲null將是一個好主意(以避免無意識的循環引用)。

<div id="delete_me"> 
    <span></span> 
    <span></span> 
</div> 

var theDiv = document.getElementById('delete_me'); 
for (var i=0; i < theDiv.childNodes.length; i++) { 
    theDiv.childNodes[i].onclick = function() { 
    // stuff 
    }; 
} 

// Later... 
// Delete stuff. 
var divToDelete = document.getElementById('delete_me'); 

// Remove all the onclicks 
for (var i=0; i < theDiv.childNodes.length; i++) { 
    theDiv.childNodes[i].onclick = null; 
} 

// Delete the div 
divToDelete.parentNode.removeChild(divToDelete); 
2

只有至少有一個引用它們的變量纔會被垃圾收集。但是,要知道,全局變量的範圍是「無處不在」可見,有時可能不會被垃圾收集,因爲他們仍然是從什麼地方看到。

例如,你有

因此,我會同意你與你的目標完成後設定以null