2013-03-10 78 views
6

嗨,我慢慢地做一個擴展鉻,我需要解析一些包含html實體的數據,我需要解碼它。我在回答中看到這裏,我可以用document.createElement它,所以我這樣做:使用document.createElement創建的元素保留在內存中嗎?

htmlDecode: function(input) { 
    if(/[<>]/.test(input)) { // To avoid creating tags like <script> :s 
     return "Invalid Input"; 
    } 
    var e = document.createElement('div'); 
    e.innerHTML = input; 
    return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue; 
} 

但是我擔心document.createElement葉元素的背後,因爲這個功能在後臺運行腳本,所以它不喜歡它經常刷新,每5分鐘運行35000次。

那麼,document.createElement創建的元素是否被釋放,還是留下來? 我的意思是,我不會將它們追加到任何地方,並且它們被攻擊到一個局部變量,但我不確定。

+1

當然,在函數運行之後,再也沒有引用div了,所以它最終會被垃圾收集。 – Bergi 2013-03-10 11:33:20

回答

1

他們將被垃圾收集。特別是,由於您正在開發Chrome擴展,因此V8傾向於非常快速地回收這樣的臨時對象,所以它不應該成爲關注的焦點。

如果您一般擔心這個問題,一個常見的解決方案是簡單地保留一個單位來做這項工作。

+0

我想你是對的,我只是想知道創建的元素是否可能卡在文檔的某個地方。我想避免創建一個div,但它可能會更好,因爲從字面上看,它被稱爲超過35k次,並且可能在元素收集之後創建元素更糟糕。 – Goodwine 2013-03-11 02:20:20

+1

如果你擔心性能,創建一個div並重新使用它可能會更有效。我不能肯定地說,因爲Chrome可能足夠聰明,可以在你決定經常創建它們的情況下爲你準備好一個div。如果使用'document.createElement'創建一個元素,除非明確這樣做,否則它不會被追加到文檔中,所以只要函數返回,它就有0個引用剩餘,並且因爲它是本地函數而不是引用其他地方,V8將立即收回,IIRC。 – 2013-03-11 21:07:48

相關問題