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 相关文章推荐
ExtJS 2.0实用简明教程 之Ext类库简介
Apr 29 Javascript
jqeury eval将字符串转换json的方法
Jan 20 Javascript
js控制input输入字符解析
Dec 27 Javascript
Angular 4 指令快速入门教程
Jun 07 Javascript
深入探究angular2 UI组件之primeNG用法
Jul 26 Javascript
使用Node.js实现RESTful API的示例
Aug 01 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
Oct 12 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
深入学习JavaScript中的bom
May 27 Javascript
vue组件三大核心概念图文详解
May 30 Javascript
js实现限定区域范围拖拉拽效果
Nov 20 Javascript
Bootstrap FileInput实现图片上传功能
Jan 28 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
中东人咖啡哲学
2021/03/03 咖啡文化
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
vue中appear的用法
2017/08/17 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
Python学习资料
2007/02/08 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
让Python代码更快运行的5种方法
2015/06/21 Python
pygame实现弹力球及其变速效果
2017/07/03 Python
Python3.5 创建文件的简单实例
2018/04/26 Python
python 除法保留两位小数点的方法
2018/07/16 Python
基于python实现名片管理系统
2018/11/30 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
Python生成词云的实现代码
2020/01/14 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
感情真挚的毕业生求职信
2014/07/19 职场文书
毕业设计致谢词
2015/05/14 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers