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)避免创建过多的对象 原则:不用了的东西要及时归还。
原文:https://www.cnblogs.com/kaicy/p/14715750.html