用於處理由DOM分配的內存的IE的內存中使用的垃圾收集器不知道如何釋放可能由JScript引擎分配的內存。因此,它只是忽略了這樣的事情。
因此,你將一個事件處理程序綁定到一個DOM元素(或類似的東西),而你的事件處理程序是一個函數在一些其他函數的調用中創建的,而另一個函數有一個本地數組那麼,在DOM元素本身被廢棄之後很久,這些億萬的東西就會生存下來,並且甚至在包含它的很久之後它已經被釋放(我想;這已經有一段時間了)。
function bindHandler(domElement) {
var hoHumWhatever = generateGiganticObjectNow();
domElement.onclick = function() {
alert("oww you clicked me");
};
}
既然在關閉中保留了「hoHumWhatever」變量。當頁面重新加載或修改了DOM以便元素被拋棄時,DOM垃圾回收器將無法對指向JScript擁有的內存的屬性執行任何操作。另一方面,JScript不知道DOM節點已經被釋放,所以它認爲閉包內存仍然被引用。
我承認這在某些細節上可能不準確,但這是基本問題。不同的人已經寫了這個,包括克羅克福德先生和(我認爲)ppk在quirksmode。
編輯 — 在更仔細的閱讀您發佈的代碼,我認爲可能是類似但相反的情況下的一個例子:小函數返回一個DOM價值的一部分的引用,所以也許有人說JScript會掛在DOM內存上(而不是反之亦然)。現在,在這個特例中,我有點懷疑,因爲我沒有看到除了對DOM屬性的簡單引用(該屬性應該是一個原始字符串實例並且真的不應該「不會造成問題。這些事情可能是騙人的,所以我只是坐在這裏,抓我的頭。
的提問要麼是非常愚蠢的或很聰明。啞,因爲沒有關閉或內存泄漏,整個事情相當於:'var firstNameValue = document.getElementById('firtName')。value;'。或者非常聰明,因爲提及關閉和內存泄漏是對真正問題的干擾 - 代碼的不必要的複雜性。 – RobG 2011-04-19 23:01:27
據報道,IE8中「內存泄漏問題」已得到解決。不過,正如@RobG在他的回答中所述,我不明白這是如何在舊版瀏覽器中造成內存泄漏的。下面的MSDN頁面列出了一系列可能導致IE7及更早版本內存泄漏的測試用例 - 我沒有看到這個模式。 http://msdn.microsoft.com/en-us/library/dd361842(VS.85).aspx – MrWhite 2012-11-26 18:34:18