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 this关键字的问题
Jan 09 Javascript
JS类定义原型方法的两种实现的区别评论很多
Sep 12 Javascript
JS批量修改PS中图层名称的方法
Jan 26 Javascript
js用typeof方法判断undefined类型
Jul 15 Javascript
java必学必会之static关键字
Dec 03 Javascript
js获取本机操作系统类型的两种方法
Dec 19 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
May 28 Javascript
javascript实现日期三级联动下拉框选择菜单
Dec 03 Javascript
浅析JS抽象工厂模式
Dec 14 Javascript
微信小程序实现传递多个参数与事件处理
Aug 12 Javascript
微信小程序报错: thirdScriptError的错误问题
Jun 19 Javascript
创建与框架无关的JavaScript插件
Dec 01 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
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
Django 生成登陆验证码代码分享
2017/12/12 Python
python实现简单遗传算法
2018/03/19 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
解决python flask中config配置管理的问题
2019/07/26 Python
Apache部署Django项目图文详解
2019/07/30 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
期中考试后的反思
2014/02/08 职场文书
运动会口号8字
2014/06/07 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
大学生逃课检讨书
2015/05/04 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
会计做账心得体会
2016/01/22 职场文书
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript
MySQL 逻辑备份 into outfile
2022/05/15 MySQL
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS