关于闭包在IE9及之前浏览器的内存泄漏问题

来源:互联网 发布:淘宝店铺邮费怎么设置 编辑:程序博客网 时间:2024/06/18 09:09

在IE9之前的版本的中,如果闭包的作用域链中保存着对HTML元素的引用,那么就意味着该元素无法被销毁。


function assHandler() {    var element = document.getElementById("myElement");    element.onclick = function () {        alert(element.id);    };}


如上述代码,创建了一个element元素事件处理程序的闭包,而这个闭包以创建了一个对element元素的循环引用。由于闭包会引用外部函数的整个活动对象。因此该闭包中也就保存了对assHandlder()函数的活动对象element对象的引用,因此无法减少对element的引用次数。只要这个闭包一直存在(因为要弹出"element.id"),所以免不了对element元素的引用,而"element.id"又在闭包函数中,就会对该元素形成循环引用。只要这个闭包一直存在,对element元素的引用至少是1次,因此它所占的内存就永远无法被回收。

解决这个问题的方法:将对element元素的引用赋值给一个变量,并且在闭包中引用这个变量,对消除了对element元素的循环引用,同时,将对element的引用赋值null,这样就回收了其占用的内存。

function assHandler() {    var element = document.getElementById("myElement");    var id = element.id; //将对element的引用赋值给一个变量    element.onclick = function () {        alert(id); //闭包中,对这个变量引用。    };    element = null; //对element的引用赋值null,这样,解除了对DOM对象的引用,顺利减少引用次数,回收内存。}


将对element元素的引用赋值给一个变量,这样就能消除对该元素的循环引用,因为闭包中只对这个变量引用。由于闭包会引用外部函数的所有活动对象,即使闭包不直接引用element,外部函数中也会保存一个对element元素的引用。此时,将element变量赋值null,这样就能解除对DOM对象的引用,顺利减少引用次数,回收其占用的内存。



总结,要想避免在IE9之前的内存泄漏问题,解决方法有两点:
1、将对HTML元素的引用赋值给一个变量,变样能消除对该元素的循环引用。

2、由于闭包会引用外部函数的整个活动对象,即使闭包不直接引用某HTML元素,但外部函数中依然会保存一个对该元素的引用(因为有通过ID、类名等获取该元素的操作),所以将这个变量赋值null,就解除了对DOM对象的引用,回收其占用的内存。

原创粉丝点击