总结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 基础学习笔记
May 29 Javascript
js里怎么取select标签里的值并修改
Dec 10 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
Jun 05 Javascript
详解JavaScript中的客户端消息框架设计原理
Jun 24 Javascript
js获取元素的外链样式的简单实现方法
Jun 06 Javascript
Angular.js中$apply()和$digest()的深入理解
Oct 13 Javascript
node.js爬虫爬取拉勾网职位信息
Mar 14 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
Jun 03 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
javascript实现数字配对游戏的实例讲解
Dec 14 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
Sep 01 Javascript
jquery绑定事件 bind和on的用法与区别分析
May 22 jQuery
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 模板高级篇总结
2006/12/21 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
理解JavaScript中的事件
2006/09/23 Javascript
jquery 上下滚动广告
2009/06/17 Javascript
js控制frameSet示例
2013/09/10 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
Vue响应式原理详解
2017/04/18 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
如何编写python的daemon程序
2021/01/07 Python
税务干部鉴定材料
2014/02/11 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
校运动会广播稿300字
2014/10/07 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
js实现自动锁屏功能
2021/06/02 Javascript
Python中time与datetime模块使用方法详解
2022/03/31 Python