IE JS编程需注意的内存释放问题


Posted in Javascript onJune 23, 2009

1、给DOM对象添加的属性是一个对象的引用。范例:
var MyObject = {};
document.getElementById('myDiv').myProp = MyObject;
解决方法:
在window.onunload事件中写上: document.getElementById('myDiv').myProp = null;

2、DOM对象与JS对象相互引用。范例:
function Encapsulator(element) {
    this.elementReference = element;
    element.myProp = this;
}
new    Encapsulator(document.getElementById('myDiv'));
解决方法:
在onunload事件中写上: document.getElementById('myDiv').myProp = null;

3、给DOM对象用attachEvent绑定事件。范例:
function doClick() {}
element.attachEvent("onclick", doClick);
解决方法:
在onunload事件中写上: element.detachEvent('onclick', doClick);

4、从外到内执行appendChild。这时即使调用removeChild也无法释放。范例:
var parentDiv =    document.createElement("div");
var childDiv = document.createElement("div");
document.body.appendChild(parentDiv);
parentDiv.appendChild(childDiv);
解决方法:
从内到外执行appendChild:
var parentDiv =    document.createElement("div");
var childDiv = document.createElement("div");
parentDiv.appendChild(childDiv);
document.body.appendChild(parentDiv);

5、反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。范例:
for(i = 0; i < 5000; i++) {
    hostElement.text = "asdfasdfasdf";
}
这种方式相当于定义了5000个属性!
解决方法:
其实没什么解决方法:P~~~就是编程的时候尽量避免出现这种情况咯~~

说明:
1、以上资料均来源于微软官方的MSDN站点,链接地址:
http://msdn.microsoft.com/librar ... e_leak_patterns.asp
大家可以到上面这个地址中看到详细的说明,包括范例和图例都有。只是我英文不太好,看不太懂,如果我上述有失误或有需要补充的地方请大家指出。

2、对于第一条,事实上包括 element.onclick = funcRef 这种写法也算在其中,因为这也是一个对对象的引用。在页面onunload时应该释放掉。

3、对于第三条,在MSDN的英文说明中好像是说即使调用detachEvent也无法释放内存,因为在attachEvent的时候就已经造成内存“LEAK”了,不过detachEvent后情况还是会好一点。不知道是不是这样,请英文好的亲能够指出。

4、在实际编程中,这些内存问题的实际影响并不大,尤其是给客户使用时,客户对此绝不会有察觉,然而这些问题对于程序员来说却始终是个心病 --- 有这样的BUG心里总会觉得不舒服吧?能解决则给与解决,这样是最好的。事实上我在webfx.eae.net这样顶级的JS源码站点中,在它们的源码里都会看到采用上述解决方式进行内存的释放管理。

研究 jsvm 的时候,发现 js.lang.System 里面定义了 gc() 方法

System.gc = function ()
{

if (System.isIeBrowser())

{

CollectGarbage();

setTimeout("CollectGarbage();", 1);

}
}

CollectGarbage() 是ie特有的一个释放内存函数

Javascript 相关文章推荐
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
Oct 17 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
Jan 24 Javascript
Javascript中的this绑定介绍
Sep 22 Javascript
javascript 获取图片尺寸及放大图片
Sep 04 Javascript
多种方法判断Javascript对象是否存在
Sep 22 Javascript
深入理解javascript严格模式(Strict Mode)
Nov 28 Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 Javascript
ReactNative实现图片上传功能的示例代码
Jul 11 Javascript
使用JQ完成表格隔行换色的简单实例
Aug 25 Javascript
解决vue select当前value没有更新到vue对象属性的问题
Aug 30 Javascript
js实现删除li标签一行内容
Apr 16 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
Apr 08 Javascript
js form 验证函数 当前比较流行的错误提示
Jun 23 #Javascript
javascript form 验证函数 弹出对话框形式
Jun 23 #Javascript
WordPress 照片lightbox效果的运用几点
Jun 22 #Javascript
WordPress JQuery处理沙发头像
Jun 22 #Javascript
JQuery 前台切换网站的样式实现
Jun 22 #Javascript
利用JQuery为搜索栏增加tag提示
Jun 22 #Javascript
web 页面分页打印的实现
Jun 22 #Javascript
You might like
php 无限级缓存的类的扩展
2009/03/16 PHP
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
php全排列递归算法代码
2012/10/09 PHP
ucenter通信原理分析
2015/01/09 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
jquery validate demo 基础
2015/10/29 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
python实现爬虫下载漫画示例
2014/02/16 Python
详解Python中的条件判断语句
2015/05/14 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
python中map()函数的使用方法示例
2017/09/29 Python
简单了解什么是神经网络
2017/12/23 Python
Python单元测试简单示例
2018/07/03 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
Django logging配置及使用详解
2019/07/23 Python
Python实现socket非阻塞通讯功能示例
2019/11/06 Python
Python列表操作方法详解
2020/02/09 Python
日语专业毕业生求职信
2013/12/04 职场文书
应聘编辑职位自荐信范文
2014/01/05 职场文书
员工培训邀请函
2014/01/11 职场文书
九年级语文教学反思
2014/02/04 职场文书
工程师岗位职责规定
2014/02/26 职场文书
相亲活动方案
2014/08/26 职场文书
民政工作个人总结
2015/02/28 职场文书
青年联谊会致辞
2015/07/31 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle
如何解决php-fpm启动不了问题
2021/11/17 PHP