在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ JS中的DOM泄漏和定時器泄漏

JS中的DOM泄漏和定時器泄漏

求問這DOM泄漏和定時器泄漏這個兩個內(nèi)存泄漏的原因?在COM樹中l(wèi)eafRef是treeFre的一個子結(jié),它內(nèi)部的數(shù)據(jù)結(jié)構(gòu)是子節(jié)點->父節(jié)點,還是父節(jié)點->子節(jié)點?

基礎(chǔ)的DOM泄漏
當(dāng)原有的DOM被移除時,子結(jié)點引用沒有被移除則無法回收。

var select = document.querySelector;
var treeRef = select('#tree');

var leafRef = select('#leaf');   //在COM樹中l(wèi)eafRef是treeFre的一個子結(jié)點

select('body').removeChild(treeRef);//#tree不能被回收入,因為treeRef還在
   解決方法:

treeRef = null;//tree還不能被回收,因為葉子結(jié)果leafRef還在
leafRef = null;//現(xiàn)在#tree可以被釋放了  

timer定時器泄漏

var val = 0;
for (var i = 0; i < 90000; i++) {
  var buggyObject = {
    callAgain: function() {
      var ref = this;
      val = setTimeout(function() {
        ref.callAgain();
      }, 90000);
  }
}
buggyObject.callAgain();
//這個時候你無法回收buggyObject
//雖然你想回收但是timer還在
buggyObject = null;

//解決辦法,先停止timer然后再回收
//解決方法,先停止定時器
clearTimeout(val);
buggyObject = null;
回答
編輯回答
茍活

在DOM樹中是父節(jié)點的指針指向子節(jié)點,但是當(dāng)父節(jié)點刪除的時候,它必須先刪除它包含的所有子節(jié)點,然后本身才能回收。但如果子節(jié)點被外部引用,就會導(dǎo)致父節(jié)點無法刪除全部子節(jié)點,所以此時父節(jié)點無法刪除。

定時器泄漏的意思是一個超時時間很長的定時器,在等待期間會被系統(tǒng)內(nèi)部引用,因此無法回收。必須先清除定時器。

2018年3月11日 06:27