1)意外的全局變量引起的內存泄露
function leak(){ leak= "xxx"; //leak成為一個全局變量,不會被回收 }
2)閉包引起的內存泄露
function bindEvent(){ var obj= document.createElement( "XXX"); obj.οnclick= function(){ //Even if it's a empty function } }
閉包可以維持函數內局部變量,使其得不到釋放。 上例定義事件回調時,由於是函數內定義函數,並且內部函數--事件回調的引用外暴了,形成了閉包。
解決之道,將事件處理函數定義在外部,解除閉包,或者在定義事件處理函數的外部函數中,刪除對dom的引用。
3)沒有清理的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')) }
4)被遺忘的定時器或者回調
var someResouce=getData(); setInterval( function(){ var node= document.getElementById( 'Node'); if(node){ node.innerHTML= JSON.stringify(someResouce) } }, 1000)
6、怎樣避免內存泄露
1)減少不必要的全局變量,或者生命周期較長的對象,及時對無用的數據進行垃圾回收;
2)注意程序邏輯,避免“死循環”之類的 ;
3)避免創建過多的對象 原則:不用了的東西要及時歸還。