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 相关文章推荐
juqery 学习之三 选择器 层级 基本
Nov 25 Javascript
自动设置iframe大小的jQuery代码
Sep 11 Javascript
一个js导致的jquery失效问题的解决方法
Nov 27 Javascript
Jquery实现自定义弹窗示例
Mar 12 Javascript
JavaScript实现函数返回多个值的方法
Jun 09 Javascript
javascript图片预加载实例分析
Jul 16 Javascript
详解Javacript和AngularJS中的Promises
Feb 09 Javascript
JavaScript随机生成颜色的方法
Oct 15 Javascript
bootstrap输入框组使用方法
Feb 07 Javascript
jQuery实现导航回弹效果
Feb 27 Javascript
javascript实现弹幕墙效果
Nov 28 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
Nov 23 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 __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
jQuery 选择器理解
2010/03/16 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
JS 在指定数组中随机取出N个不重复的数据
2014/06/10 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
Python isinstance判断对象类型
2008/09/06 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
python实现点对点聊天程序
2018/07/28 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
Python 读取位于包中的数据文件
2020/08/07 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
德国购买健身器材:AsVIVA
2017/08/09 全球购物
银行柜员应聘推荐信范文
2013/11/24 职场文书
年度考核评语
2014/01/19 职场文书
老公保证书
2015/01/17 职场文书
楚门的世界观后感
2015/06/03 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS