总结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 相关文章推荐
js left,right,mid函数
Jun 10 Javascript
图片自动缩小 点击放大
Jul 07 Javascript
写自已的js类库需要的核心代码
Jul 16 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
Feb 20 Javascript
Javascript的闭包详解
Dec 26 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
Dec 24 Javascript
JavaScript 模块化编程(笔记)
Apr 08 Javascript
AngularJS基础知识笔记之表格
May 10 Javascript
浅谈如何实现easyui的datebox格式化
Jun 12 Javascript
JQueryMiniUI按照时间进行查询的实现方法
Jun 07 jQuery
在element-ui的select下拉框加上滚动加载
Apr 18 Javascript
javascript执行上下文、变量对象实例分析
Apr 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变量存储的详解
2013/06/13 PHP
对于PHP 5.4 你必须要知道的
2013/08/07 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
php中的动态调用实例分析
2015/01/07 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
2018/12/12 Javascript
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
python实现红包裂变算法
2016/02/16 Python
Python程序退出方式小结
2017/12/09 Python
Django实现表单验证
2018/09/08 Python
Python爬虫文件下载图文教程
2018/12/23 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
python安装sklearn模块的方法详解
2020/11/28 Python
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
《池塘边的叫声》教学反思
2014/04/12 职场文书
体育教师求职信
2014/06/30 职场文书
班级活动总结格式
2014/08/30 职场文书
学习党代会心得体会
2014/09/05 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
工作态度怎么写
2015/06/25 职场文书
教师外出学习心得体会
2016/01/18 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
如何在C++中调用Python
2021/05/21 Python