JS内存泄漏常见的情况

内存泄漏是指不能再使用的内存,没有及时释放

情况1.意外的全局变量

function leaks(){
        a = 3;
 }

当leaks函数执行完后,由于a是全局变量,所以还存在,没有及时释放。但在严格模式'user strict' 下,严格模式会阻止你创建意外的全局变量

情况2.闭包

function assignHandler(){
        let element = document.getElementById("someElement");
        element.onclick = function () {
            alert(element.id);
        };
    }

上面的匿名函数就是一个闭包,element元素被该闭包引用,因此无法减少对element的引用数。不过可以解决,如下

function assignHandler(){
        let element = document.getElementById("someElement");
        let id = element.id;
        element.onclick = function () {
            alert(id);
        };
        element = null;
    }

通过把element.id的一个副本保存在一个变量中,把element变量设置微null来删除对dom的引用。这样就可以减少对dom的引用数,从而正常回收其占用的内存

情况3.循环引用

循环引用 在引用计数策略下会导致内存泄漏,标记清除不会。
解决办法:手工解除循环引用。

function fn() {
 var a = {};
 var b = {};
 a.pro = b;
 b.pro = a;
} 
fn();

a和b的引用次数都是2,fn()执行完毕后,两个对象都已经离开环境。
在标记清除方式下是没有问题的,但是在引用计数策略下,a和b的引用次数不为0,不会被垃圾回收器回收内存。如果fn函数被大量调用,就会造成内存泄漏。

情况4

当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

这里,为了避免双击,单击按钮时将按钮移除并替换成一条消息,相信大家见过这种"操作"。但问题出在,当按钮从页面中移除时,它还带着一个事件处理程序呢
改成下面

http://www.cnblogs.com/sprying/archive/2013/05/31/3109517.html

每天都努力一点点
谢谢你看完


你可能感兴趣的:(JS内存泄漏常见的情况)