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实现点击输入框弹出窗体选择信息
Dec 11 Javascript
jquery基础教程之数组使用详解
Mar 10 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
Jan 09 Javascript
js实现的早期滑动门菜单效果代码
Aug 27 Javascript
js基础之DOM中元素对象的属性方法详解
Oct 28 Javascript
jQuery表格的维护和删除操作
Feb 03 Javascript
详解Vue用axios发送post请求自动set cookie
May 10 Javascript
关于TypeScript模块导入的那些事
Jun 12 Javascript
JQueryDOM之样式操作
Mar 27 jQuery
vue 兄弟组件的信息传递的方法实例详解
Aug 30 Javascript
js实现九宫格抽奖
Mar 19 Javascript
详解Vue Cli浏览器兼容性实践
Jun 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
论建造顺序的重要性
2020/03/04 星际争霸
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
jQuery鼠标事件总结
2016/10/13 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
js实现漂亮的星空背景
2019/11/01 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
5款非常棒的Python工具
2018/01/05 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
python实现无边框进度条的实例代码
2020/12/30 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
旅游项目开发策划书
2014/01/18 职场文书
入党申请自荐书范文
2014/02/11 职场文书
马智宇结婚主持词
2014/04/01 职场文书
竞选班委演讲稿
2014/04/28 职场文书
鲁迅故里导游词
2015/02/05 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书