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 当前日期加(天、周、月、年)
Aug 09 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
Jan 27 Javascript
JS控制一个DIV层在指定时间内消失的方法
Feb 17 Javascript
node.js中的fs.readdirSync方法使用说明
Dec 17 Javascript
详解Vue整合axios的实例代码
Jun 21 Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
Feb 24 jQuery
vue  自定义组件实现通讯录功能
Sep 30 Javascript
vue中v-text / v-html使用实例代码详解
Apr 02 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 Javascript
jquery实现上传文件进度条
Mar 26 jQuery
关于JavaScript回调函数的深入理解
Jun 27 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
JS array 数组详解
2009/03/22 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
jQuery MD5加密实现代码
2010/03/15 Javascript
JS 文件传参及处理技巧分析
2010/05/13 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
jQuery性能优化的38个建议
2014/03/04 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
理解JavaScript原型链
2016/10/25 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
Python的time模块中的常用方法整理
2015/06/18 Python
python简单判断序列是否为空的方法
2015/06/30 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
会员卡清退活动总结
2014/08/27 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
初中学生操行评语
2014/12/26 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS