关于闭包在IE9及之前浏览器的内存泄漏问题
2017-07-17 20:56
274 查看
在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,这样就回收了其占用的内存。
将对element元素的引用赋值给一个变量,这样就能消除对该元素的循环引用,因为闭包中只对这个变量引用。由于闭包会引用外部函数的所有活动对象,即使闭包不直接引用element,外部函数中也会保存一个对element元素的引用。此时,将element变量赋值null,这样就能解除对DOM对象的引用,顺利减少引用次数,回收其占用的内存。
总结,要想避免在IE9之前的内存泄漏问题,解决方法有两点:
1、将对HTML元素的引用赋值给一个变量,变样能消除对该元素的循环引用。
2、由于闭包会引用外部函数的整个活动对象,即使闭包不直接引用某HTML元素,但外部函数中依然会保存一个对该元素的引用(因为有通过ID、类名等获取该元素的操作),所以将这个变量赋值null,就解除了对DOM对象的引用,回收其占用的内存。
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对象的引用,回收其占用的内存。
相关文章推荐
- 关于切图生成页面时,IE9以下浏览器,table包含的图片会有下补白的问题解决
- 关于服务器响应,浏览器请求的理解以及javaWeb项目的编码问题
- 关于Javascript的内存泄漏问题的整理稿
- 浏览器内存泄漏问题的跟踪与解决
- 关于Qt5 QSerialPort使用内存泄漏问题
- 关于dao得一些使用问题,以备忘....也用来纪念自己解决得第一个内存泄漏问题
- y关于内存泄漏及优化问题
- 关于浏览器缓存,版本更新问题
- 关于不同操作系统下浏览器兼容问题
- 关于Silverlight 添加右键在某些浏览器中看不到的问题
- 关于字符串与字节byte之前的相互转换问题
- 关于 苹果手机 微信浏览器里点击返回不加载方法的问题
- 关于ajax的下载被浏览器阻止的问题
- 关于用WebView或手机浏览器打开连接问题
- 关于各种浏览器的css不透明度的问题
- 关于浏览器破图宽度显示28像素的问题
- 关于CSS 浏览器兼容的两个问题
- 关于Android VideoView导致的内存泄漏的问题
- 在IE9里面使用easyui关于iframe的问题
- 关于实现自定义浏览器框架的相关细节问题