总结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 22 Javascript
Javascript打印网页部分内容的脚本
Nov 17 Javascript
jQuery 开天辟地入门篇一
Dec 09 Javascript
Extjs入门之动态加载树代码
Apr 09 Javascript
一个基于jquery的图片切换效果
Jul 06 Javascript
Javascript合并表格中具有相同内容单元格示例
Aug 11 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
Mar 09 Javascript
javascript实现控制浏览器全屏
Mar 30 Javascript
微信小程序之滚动视图容器的实现方法
Sep 26 Javascript
Angular4学习笔记router的简单使用
Mar 30 Javascript
Express之托管静态文件的方法
Jun 01 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
Oct 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
深入解析php模板技术原理【一】
2008/01/10 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
Javascript浅谈之this
2013/12/17 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
python 检查是否为中文字符串的方法
2018/12/28 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
大三预备党员入党思想汇报
2014/01/08 职场文书
感恩父母的演讲稿
2014/05/06 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
司考复习计划
2015/01/19 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB