总结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 相关文章推荐
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
May 08 Javascript
Date对象格式化函数代码
Jul 17 Javascript
ajax中get和post的说明及使用与区别
Dec 23 Javascript
jQuery Migrate 1.1.0 Released 注意事项
Jun 14 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
基于js 本地存储(详解)
Aug 16 Javascript
Bootstrap table使用方法记录
Aug 23 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
Dec 29 Javascript
vue二级菜单导航点击选中事件的方法
Sep 12 Javascript
jquery实现选项卡切换代码实例
May 14 jQuery
微信小程序实现拖拽功能
Sep 26 Javascript
vue 扩展现有组件的操作
Aug 14 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 smarty的预保留变量总结
2008/12/04 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
Python3实现腾讯云OCR识别
2018/11/27 Python
Python安装selenium包详细过程
2019/07/23 Python
详解python中docx库的安装过程
2019/11/08 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
Python爬虫之Selenium设置元素等待的方法
2020/12/04 Python
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
有限责任公司股东合作协议书范本
2014/10/30 职场文书
2014年少先队工作总结
2014/12/03 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
关于召开会议的通知
2015/04/15 职场文书
海洋天堂观后感
2015/06/05 职场文书
陪护人员误工证明
2015/06/24 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
周末问候语大全
2015/11/10 职场文书
Python matplotlib绘制雷达图
2022/04/13 Python
mysql sock 文件解析及作用讲解
2022/07/15 MySQL