关于闭包在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对象的引用,回收其占用的内存。
阅读全文
0 0
- 关于闭包在IE9及之前浏览器的内存泄漏问题
- 闭包内存泄漏问题
- 关于内存泄漏的问题
- 关于内存泄漏的问题
- 关于内存泄漏的问题
- 关于内存泄漏问题
- [IE9] 解决了傲游、搜狗浏览器在IE9下网页截图的问题
- 关于 JAVA 的内存泄漏问题
- Android:关于ListView的内存泄漏问题
- 关于performSelector的内存泄漏问题
- 关于DWR内存泄漏的问题
- 关于WebView使用,内存泄漏的问题
- ASIHttpRequest 在ios7的内存泄漏问题
- SWFUpload 在IE9下不显示问题及IE9中模态窗下flash文件选择问题的处理
- SWFUpload 在IE9下不显示问题及IE9中模态窗下flash文件选择问题的处理
- javascript闭包产生的内存泄漏
- 关于glibc编译及getaddrinfo内存泄漏问题
- 关于Java中的内存泄漏问题及注意事项
- spring的dao接口扫描(MapperFactoryBean与MapperScannerConfigurer)
- HDU-5972 Regular Number(Shift-And)
- mapper绑定异常 springframework.web.util.NestedServletException
- JSP技术的总结
- 单链表含环的各种面试题
- 关于闭包在IE9及之前浏览器的内存泄漏问题
- python爬虫
- 283. Move Zeroes
- ubuntu shell推荐——zsh
- mysql里面的伪事务-----MyISAM存储引擎的锁机制
- python基础之模块和类
- [转] MATLAB概率密度函数估计
- 引用和拷贝构造函数
- 大规模MIMO技术概述