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 相关文章推荐
JavaScript访问CSS属性的几种方式介绍
Jul 21 Javascript
js+jquery常用知识点汇总
Mar 03 Javascript
jQuery鼠标事件汇总
Aug 30 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
Oct 22 Javascript
Javascript中神奇的this
Jan 20 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
Oct 13 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
Jan 16 Javascript
js阻止移动端页面滚动的两种方法
Jan 25 Javascript
深入理解node.js http模块
Jan 24 Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 Javascript
利用原生JavaScript实现造日历轮子实例代码
May 08 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 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
PHP print类函数使用总结
2010/06/25 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
2019/05/06 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
2020/03/03 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
Node.js插件的正确编写方式
2014/08/03 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
小程序转发探索示例
2019/02/19 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
大学自我鉴定范文
2013/12/26 职场文书
企业新年寄语
2014/04/04 职场文书
给孩子的新年寄语
2014/04/08 职场文书
毕业生求职信范文
2014/06/29 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
python基础之函数的定义和调用
2021/10/24 Python
详细介绍python操作RabbitMq
2022/04/12 Python