面接問題--JSのどの操作が内容漏れの原因になりますか?

1438 ワード

予期しないグローバル変数によるメモリリーク

function leak(){
  leak="xxx";//leak        ,     
}

クローズドによるメモリリーク
function bindEvent(){
  var obj=document.createElement("XXX");
  obj.onclick=function(){
    //Even if it's a empty function
 }

クローズドは、関数内の局所変数を維持して、リリースできないようにします.上記の例では、イベントのコールバックを定義した場合、関数内定義関数であり、内部関数であるイベントのコールバックの参照が暴かれ、クローズドが形成されました.解決の道は、イベント処理関数を外部に定義し、クローズドを解除したり、イベント処理関数を定義する外部関数からdomへの参照を削除します.
整理されていないDOM元素の参照

var elements={
    button: document.getElementById("button"),
    image: document.getElementById("image"),
    text: document.getElementById("text")
};
function doStuff(){
    image.src="http://some.url/image";
    button.click():
    console.log(text.innerHTML)
}
function removeButton(){
    document.body.removeChild(document.getElementById('button'))
}

忘れられたタイマーまたはコールバック

var someResouce=getData();
setInterval(function(){
    var node=document.getElementById('Node');
    if(node){
        node.innerHTML=JSON.stringify(someResouce)
    }
},1000)

このようなコードは一般的であり、IDがNodeの要素である場合はDOMから除去されても、このタイマーは存在します.また、コールバック関数にはsomeResourceへの参照が含まれていますので、タイマーの外のsomeResourceも解放されません.
どのようにメモリが漏れることを免れますか?
  • 不要なグローバル変数、またはライフサイクルが長いオブジェクトを減らし、不要なデータを速やかにゴミ回収する
  • .
  • プログラムロジックに注意し、「死循環」などの
  • を避ける.
  • オブジェクトの過剰作成を避けるために原則:不要なものは直ちに
  • を返す必要があります.