javascript - js記憶體洩漏問題
黄舟
黄舟 2017-05-19 10:42:35
0
4
709
   var user = { name: 'tom', age: 20, gender: 'male' }
   var test = document.getElementById('test');
       test.onclick = function() {
           test.innerHTML = user.name;
       }
   user = null; // 释放对象
   

最近遇到一個這樣的面試題,請問這段有沒有記憶體洩漏,如果有的話麻煩大神指出為什麼,並且如何消除記憶體洩漏

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(4)
给我你的怀抱

記憶體洩漏簡單的說就是分配的記憶體既不能使用,又不能回收,直到瀏覽器進程結束。

對於循環引用問題直接消除引用就好,設定test=null,因为js垃圾回收機制會週期的執行,找出不再使用的變數,然後釋放掉其佔用的記憶體.
垃圾回收

,然後釋放掉其🎜佔用的記憶體🎜.🎜垃圾回收🎜,然後釋放掉其🎜佔用的記憶體🎜.🎜垃圾回收🎜,然後釋放掉其🎜佔用的記憶體🎜.🎜垃圾回收🎜,然後釋放掉其🎜佔用的記憶體🎜.🎜垃圾回收🎜,然後釋放掉其🎜佔用的記憶體🎜.🎜垃圾回收🎜,然後釋放掉其🎜佔用的記憶體🎜.🎜垃圾回收🎜,然後釋放掉其🎜佔用的記憶體🎜.🎜垃圾回收🎜,然後釋放其🎜
仅有的幸福

原理就是下面這張圖,你的test就是圖裡的elem,引用一個dom元素,並加入一個事件處理器給這個dom元素,但事件處理的函數又引用了外部作用域的test,這樣就照成了循環引用。

會照成記憶體洩漏的其實是test而不是user,將外部的test的引用清空即可破壞這個循環引用。

這些其實在現代瀏覽器中由於標記-清除演算法的使用都不會有問題了,舊瀏覽器因為垃圾回收演算法只有於引用才會導致記憶體洩露,即循環引用導致物件不可用之後仍無法被垃圾回收。

世界只因有你

什麼叫記憶體洩漏?

這個倒是會執行出錯。 。 。 。 。 。

巴扎黑

一定有,CVTE的面試題裡面有這個。因為click事件裡面保留了對user.name的引用,所以還是會有洩漏的。
如何消除的問題,我能想到的也只有高程上說的直接解除引用了

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板