总结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 顺便学习下CSS选择器 奇偶匹配nth-child(even)
May 24 Javascript
一个简单的js动画效果代码
Jul 20 Javascript
js+html+css实现鼠标移动div实例
Jan 30 Javascript
JS判断文本框内容改变事件的简单实例
Mar 07 Javascript
js获取客户端网卡的IP地址、MAC地址
Mar 26 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
Aug 27 Javascript
js中toString()和String()区别详解
Mar 23 Javascript
javascript实现二叉树遍历的代码
Jun 08 Javascript
JS随机排序数组实现方法分析
Oct 11 Javascript
JS学习笔记之原型链和利用原型实现继承详解
May 29 Javascript
Element 默认勾选表格 toggleRowSelection的实现
Sep 04 Javascript
js实现飞机大战游戏
Aug 26 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
极典R601SW收音机
2021/03/02 无线电
php cout<<的一点看法
2010/01/24 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
PHP的几个常用加密函数
2016/02/03 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
Python set集合类型操作总结
2014/11/07 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
python dict 相同key 合并value的实例
2019/01/21 Python
Python3远程监控程序的实现方法
2019/07/15 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
Python sorted排序方法如何实现
2020/03/31 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
意大利团购网站:Groupon意大利
2016/10/11 全球购物
法院实习人员自我鉴定
2013/09/26 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
班主任工作经验材料
2014/02/02 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书