总结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实现左右div自适应高度完全相同的代码
Aug 09 Javascript
jQuery客户端分页实例代码
Nov 18 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 Javascript
Node.js和MongoDB实现简单日志分析系统
Apr 25 Javascript
RGB和YUV 多媒体编程基础详细介绍
Nov 04 Javascript
javascript 利用arguments实现可变长参数
Nov 21 Javascript
AngularJS2中一种button切换效果的实现方法(二)
Mar 27 Javascript
详解如何在Vue项目中导出Excel
Apr 19 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
May 23 Javascript
微信小程序版本自动更新的方法
Jun 14 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
Feb 11 Javascript
ReactRouter的实现方法
Jan 25 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的安全
2006/10/09 PHP
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
php下载文件的代码示例
2012/06/29 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
JS 面向对象之神奇的prototype
2011/02/26 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
Vue下的国际化处理方法
2017/12/18 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
node.js文件操作系统实例详解
2019/11/05 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python基于itchat模块实现微信防撤回
2019/04/29 Python
Django接收自定义http header过程详解
2019/08/23 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
Linux文件系统类型
2012/02/15 面试题
生产部经理岗位职责
2013/12/16 职场文书
竞聘上岗演讲稿范文
2014/01/10 职场文书
党员违纪检讨书
2014/02/18 职场文书
小学生元旦广播稿
2014/02/21 职场文书
公务员个人考察材料
2014/12/23 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书