Javascript 闭包引起的IE内存泄露分析


Posted in Javascript onMay 23, 2012
function fors(){ 
obj_a = obj_b; 
obj_b.attr = obj_a; 
}

function fors(){ 
obj_b = {}; 
obj_b.attr = obj_b; 
}

上面是两个个很显示的循环引用,IE中产生了内存泄露,由于IE的内存回收机制,导至会长期占用内存而不能释放。

但闭包的内存泄露,有些隐蔽。因为闭包的循环引用,是间接的。

function iememery(){ 
var js_obj = document.createElement("div"); 
js_obj.oncontextmenu = function(){ return false;} 
} 
<body onload="iememery()">

从表面上看,没有任何循环引用。但上面是一个闭包,根据闭包的特性,内部函数有权访问外部函数的变量对象。所以当iememery()执行之后:
js_obj是一个DOM元素的引用,DOM元素它长期在网页当中,不会消失,而这个DOM元素的一属性oncontextmenu,又是内部的函数引用(闭包),而这个匿名函数又和js_obj之间有隐藏的关联(作用域链)
所以形成了一个,循环引用.即:
js_obj.oncontextmenu 间接引用到 js_obj 也就是说,这个对象的一个属性,又间接的引用了自己。
只要有循环引用,就会在IE下产生内存泄露。打开你的windows任务管理器,在IE中不停刷新含有这个代码的html页面,看看Iexploer进程的内存占用情况,一直上升,且不会自动回收(降低);
解决办法:
function iememery(){ var js_obj = document.createElement("div"); 
js_obj.oncontextmenu = function(){ return false;};


js_obj.oncontextmenu = null;//加上这句,断开引用 }

当IE中发生js对象与dom对象直接的循环引用,并且之后没有引用指向他们,
如果是IE 6, 内存泄漏,直到关闭IE进程为止
如果是IE 7,内存泄漏, 直到离开当前页面为止
如果是IE 8, GC回收器回收他们的内存,无论当前是不是compatibility模式。
之前的IE js引擎里的GC回收器只能处理js对象,不能处理DOM对象。
Javascript 相关文章推荐
offsetParent 算法分析
Apr 05 Javascript
jquery实现盒子下拉效果示例代码
Sep 12 Javascript
防止按钮在短时间内被多次点击的方法
Mar 10 Javascript
Bootstrap每天必学之缩略图与警示窗
Nov 29 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
Jan 25 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
May 31 Javascript
js实现4个方向滚动的球
Mar 06 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
Jul 06 Javascript
javascript 日期相减-在线教程(附代码)
Aug 17 Javascript
微信小程序实现下拉刷新和轮播图效果
Nov 21 Javascript
React倒计时功能实现代码——解耦通用
Sep 18 Javascript
Vue 的 v-model用法实例
Nov 23 Vue.js
基于jQuery的图片左右无缝滚动插件
May 23 #Javascript
判断多个input type=file是否有已经选择好文件的代码
May 23 #Javascript
jQuery 1.7.2中getAll方法的疑惑分析
May 23 #Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
May 23 #Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
May 23 #Javascript
jquery.pagination.js 无刷新分页实现步骤分享
May 23 #Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
May 23 #Javascript
You might like
晶体管来复再生式二管收音机
2021/03/02 无线电
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
解析yii数据库的增删查改
2013/06/20 PHP
php析构函数的简单使用说明
2015/08/24 PHP
PHP程序员的技术成长规划
2016/03/25 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
js中更短的 Array 类型转换
2011/10/30 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
简单介绍Python中的JSON使用
2015/04/28 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
python3字符串操作总结
2019/07/24 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
大学生个人求职信范文
2013/09/21 职场文书
办公室主任岗位承诺书
2014/05/29 职场文书
宣传普通话标语
2014/06/27 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
高三教师工作总结2015
2015/07/21 职场文书
思想工作总结范文
2015/08/12 职场文书
MySQL 数据类型详情
2021/11/11 MySQL
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang