面接問題--JSのどの操作が内容漏れの原因になりますか?
1438 ワード
予期しないグローバル変数によるメモリリーク
整理されていないDOM元素の参照
どのようにメモリが漏れることを免れますか?不要なグローバル変数、またはライフサイクルが長いオブジェクトを減らし、不要なデータを速やかにゴミ回収する .プログラムロジックに注意し、「死循環」などの を避ける.オブジェクトの過剰作成を避けるために原則:不要なものは直ちに を返す必要があります.
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も解放されません.どのようにメモリが漏れることを免れますか?