总结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 闭包深入理解(closure)
May 27 Javascript
基于jquery的大众点评,分类导航实现代码
Aug 23 Javascript
jQuery事件 delegate()使用方法介绍
Oct 30 Javascript
javascript中with()方法的语法格式及使用
Aug 04 Javascript
js控制div弹出层实现方法
May 11 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
Oct 09 Javascript
JS生成一维码(条形码)功能示例
Jan 19 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
Apr 27 Javascript
VueJS 取得 URL 参数值的方法
Jul 19 Javascript
浅谈layui 绑定form submit提交表单的注意事项
Oct 25 Javascript
原生js实现俄罗斯方块
Oct 20 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
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设计模式 Strategy(策略模式)
2011/06/26 PHP
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
js实现抽奖的两种方法
2020/03/19 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
python单元测试unittest实例详解
2015/05/11 Python
简单了解python协程的相关知识
2019/08/31 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
关于人生的感言
2014/01/17 职场文书
承办会议欢迎词
2014/01/17 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
大学军训感言300字
2014/03/09 职场文书
优秀教师工作总结2015
2015/07/22 职场文书