var user = { name: 'tom', age: 20, gender: 'male' }
var test = document.getElementById('test');
test.onclick = function() {
test.innerHTML = user.name;
}
user = null; // 释放对象
最近遇到一個這樣的面試題,請問這段有沒有記憶體洩漏,如果有的話麻煩大神指出為什麼,並且如何消除記憶體洩漏
给我你的怀抱2017-05-19 10:44:35
記憶體洩漏簡單的說就是分配的記憶體既不能使用,又不能回收,直到瀏覽器進程結束。
對於循環引用問題直接消除引用就好,設定test=null
,因为js
垃圾回收機制會週期的執行,找出不再使用的變數,然後釋放掉其佔用的記憶體.
垃圾回收
仅有的幸福2017-05-19 10:44:35
原理就是下面這張圖,你的test就是圖裡的elem,引用一個dom元素,並加入一個事件處理器給這個dom元素,但事件處理的函數又引用了外部作用域的test,這樣就照成了循環引用。
會照成記憶體洩漏的其實是test而不是user,將外部的test的引用清空即可破壞這個循環引用。
這些其實在現代瀏覽器中由於標記-清除演算法的使用都不會有問題了,舊瀏覽器因為垃圾回收演算法只有於引用才會導致記憶體洩露,即循環引用導致物件不可用之後仍無法被垃圾回收。
巴扎黑2017-05-19 10:44:35
一定有,CVTE的面試題裡面有這個。因為click事件裡面保留了對user.name的引用,所以還是會有洩漏的。
如何消除的問題,我能想到的也只有高程上說的直接解除引用了