搜尋

首頁  >  問答  >  主體

javascript - js記憶體洩漏問題

   var user = { name: 'tom', age: 20, gender: 'male' }
   var test = document.getElementById('test');
       test.onclick = function() {
           test.innerHTML = user.name;
       }
   user = null; // 释放对象
   

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

黄舟黄舟2744 天前718

全部回覆(4)我來回復

  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:44:35

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

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

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

    回覆
    0
  • 仅有的幸福

    仅有的幸福2017-05-19 10:44:35

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

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

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

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-19 10:44:35

    什麼叫記憶體洩漏?

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

    回覆
    0
  • 巴扎黑

    巴扎黑2017-05-19 10:44:35

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

    回覆
    0
  • 取消回覆