总结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 相关文章推荐
十个优秀的Ajax/Javascript实例网站收集
Mar 31 Javascript
javascript实现的闭包简单实例
Jul 17 Javascript
jQuery 获取多选框的值及多选框中文的函数
May 16 Javascript
Windows系统下安装Node.js的步骤图文详解
Nov 15 Javascript
JavaScript实现选中文字提示新浪微博分享效果
Jun 15 Javascript
React-Native中禁用Navigator手势返回的示例代码
Sep 09 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
Sep 20 Javascript
详解layui弹窗父子窗口之间传参数的方法
Jan 16 Javascript
ES7之Async/await的使用详解
Mar 28 Javascript
mpvue小程序循环动画开启暂停的实现方法
May 15 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
Jul 26 Javascript
WebPack工具运行原理及入门教程
Dec 02 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
php中的boolean(布尔)类型详解
2013/10/28 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
JavaScript的目的分析
2007/01/05 Javascript
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
详解JavaScript中的坐标和距离
2019/05/27 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
js代码实现轮播图
2020/05/04 Javascript
详细介绍Python的鸭子类型
2016/09/12 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
在Python web中实现验证码图片代码分享
2017/11/09 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
python pytest进阶之fixture详解
2019/06/27 Python
python科学计算之narray对象用法
2019/11/25 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
浅析Python requests 模块
2020/10/09 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
小学生交通安全寄语
2015/02/27 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
赞美教师的句子
2019/09/02 职场文书
Golang并发操作中常见的读写锁详析
2021/08/30 Golang
Docker下安装Oracle19c
2022/04/13 Servers