总结JavaScript在IE9之前版本中内存泄露问题


Posted in Javascript onApril 28, 2018

IE9之前的版本对JScript对象和COM对象使用不同的垃圾回收例程(COM对象采用“引用计数”收集策略),因此闭包在IE的这些版本中会导致一些特殊问题。具体来说,如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素将无法被销毁。
来看下面的例子:

function assignHandler() {
  var elem = document.getElementById('elem_id');
  elem.onclick = function(evt) {
    alert(elem.id);
  };
}

以上代码创建了一个作为elem元素事件处理程序的闭包,而这个闭包则又创建了一个循环引用。由于匿名函数保存了一个对assignHandler()的活动对象的引用,因此就会导致无法减少elem的引用数。只要匿名函数存在,elem的引用数至少也是1,因此它所占用的内存就永远不会被回收。

可以将上面的代码稍作修改一下就可以解决:

function assignHandler() {
  var elem = document.getElementById('elem_id');
  var elem_id = elem.id;
  elem.onclick = function(evt) {
    alert(elem_id);
  };
  elem = null;
}

通过把elem.id的一个副本保存在一个变量中,并且在闭包中引用该变量消除了循环引用。但仅仅做到这一步,还是不能解决内存泄露问题。

“闭包会引用包含函数的整个活动对象,而其中就包含着elem。即使闭包不直接引用elem,包含函数的活动对象中也仍然会保存一个引用。因此,有必要把elem设置为null。这样就能解除对DOM对象的引用,顺利地减少其引用数,确保正常回收其占用的内存”

Javascript 相关文章推荐
jquery入门—编写一个导航条(可伸缩)
Jan 07 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
May 15 Javascript
三种检测iPhone/iPad设备方向的方法
Apr 23 Javascript
javascript模拟订火车票和退票示例
Apr 24 Javascript
原生js实现可爱糖果数字时间特效
Dec 30 Javascript
javascript 中的继承实例详解
May 05 Javascript
如何理解Vue的.sync修饰符的使用
Aug 17 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
May 31 Javascript
vue-router命名路由和编程式路由传参讲解
Jan 19 Javascript
Vue单文件组件开发实现过程详解
Jul 30 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
Oct 12 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
Apr 28 #Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
Apr 28 #Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
Apr 27 #Javascript
React Native日期时间选择组件的示例代码
Apr 27 #Javascript
vue实现点击展开点击收起效果
Apr 27 #Javascript
vue中post请求以a=a&b=b 的格式写遇到的问题
Apr 27 #Javascript
vue项目中应用ueditor自定义上传按钮功能
Apr 27 #Javascript
You might like
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
PHP实现倒计时功能
2020/11/16 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
git进行版本控制心得详谈
2017/12/10 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
python实现图书管理系统
2018/03/12 Python
Python中return self的用法详解
2018/07/27 Python
使用Python和Scribus创建一个RGB立方体的方法
2019/07/17 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
Pytorch之parameters的使用
2019/12/31 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
英国足球店:UK Soccer Shop
2017/11/19 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
医院护士见习期自我鉴定
2014/04/10 职场文书
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android