总结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图像处理思路及实现代码
Dec 25 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
Apr 26 Javascript
js特殊字符转义介绍
Nov 05 Javascript
jQuery判断checkbox是否选中的小例子
Dec 02 Javascript
JavaScript中的6种运算符总结
Oct 16 Javascript
Js动态设置rem来实现移动端字体的自适应代码
Oct 14 Javascript
vue2.0父子组件间通信的实现方法
Apr 19 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
Jul 24 Javascript
javascript实现文字无缝滚动效果
Aug 26 Javascript
js时间戳与日期格式之间转换详解
Dec 11 Javascript
JavaScript中 ES6变量的结构赋值
Jul 10 Javascript
JavaScript图片旋转效果实现方法详解
Jun 28 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
风味层面去分析咖啡油脂
2021/03/03 咖啡文化
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
2016/11/20 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
JS 显示当前日期与时间的代码
2010/03/24 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
python操作mysql数据库
2017/03/05 Python
python opencv读mp4视频的实例
2018/12/07 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
python实现经纬度采样的示例代码
2020/12/10 Python
个人工作表现评语
2014/04/30 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
品质保证书格式
2015/02/28 职场文书
刑事附带民事代理词
2015/05/25 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Vue如何实现组件间通信
2021/05/15 Vue.js
mysql数据库隔离级别详解
2022/06/16 MySQL