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 相关文章推荐
一些不错的js函数ajax
Aug 20 Javascript
PNG背景在不同浏览器下的应用
Jun 22 Javascript
JS 时间显示效果代码
Aug 23 Javascript
基于jquery的cookie的用法
Jan 10 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
JavaScript整除运算函数ceil和floor的区别分析
Apr 14 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
Feb 15 Javascript
vue实现动态数据绑定
Apr 28 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
Apr 28 Javascript
Javascript查看大图功能代码实现
May 07 Javascript
Vue为什么要谨慎使用$attrs与$listeners
Aug 27 Javascript
JS实现购物车基本功能
Nov 08 Javascript
基于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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
event对象的方法 兼容多浏览器
2009/06/27 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
一款简单的jQuery图片标注效果附源码下载
2016/03/22 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
解读! Python在人工智能中的作用
2017/11/14 Python
python实现机器人行走效果
2018/01/29 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
解析Python的缩进规则的使用
2019/01/16 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
校园门卫岗位职责
2013/12/09 职场文书
生产助理岗位职责
2014/06/18 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技
canvas 中如何实现物体的框选
2022/08/05 Javascript