1、 意外的全局变量。未被声明的变量,会被挂在window对象下,不能及时的销毁。
2、计时器和回调函数timers。定时器setInterval或者setTimeout在不需要使用的时候,没有被clear,导致定时器的回调函数及其内部依赖的变量都不能被回收,这就会造成内存泄漏。
3、DOM泄漏。
(1)给DOM对象添加的属性是一个对象的引用。解决方法:在window.onload时间中加上 document.getElementById('id').diyProp = null;
(2)元素引用没有清理。var a = document.getElementById('id'); document.body.removeChild(a); 这种操作不能回收,因为存在变量a对它的引用。虽然我们用removeChild移除了,但是还在对象里保存着#的引用,即DOM元素还在内存里面。解决方法:a = null;
(3)事件的绑定没有移除。监听事件没有移除。
4、js闭包。闭包在IE6下会造成内存泄漏,但是现在已经无须考虑了。值得注意的是闭包本身不会造成内存泄漏,但闭包过多很容易导致内存泄漏。闭包会造成对象引用的生命周期脱离当前函数的上下文,如果闭包如果使用不当,可以导致环形引用(circular reference),类似于死锁,只能避免,无法发生之后解决,即使有垃圾回收也还是会内存泄露。
5、 console日志记录。控制台日志记录对总体内存内置文件的影响,也是个重大的问题,同时也是容易被忽略的。记录错误的对象,可以将大量的数据保留在内存中。传递给console.log的对象是不能被垃圾回收,所以没有去掉console.log可能会存在内存泄漏~