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 相关文章推荐
jQuery 剧场版 你必须知道的javascript
May 27 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
Nov 08 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
Oct 17 Javascript
实例详解angularjs和ajax的结合使用
Oct 22 Javascript
Jquery easyui开启行编辑模式增删改操作
Jan 14 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
Jun 01 Javascript
Angular 路由route实例代码
Jul 12 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
Apr 21 Javascript
利用Decorator如何控制Koa路由详解
Jun 26 Javascript
微信小程序Getuserinfo解决方案图解
Aug 24 Javascript
Vue.js数字输入框组件使用方法详解
Oct 19 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函数的常用方法及注意之处小结
2011/07/10 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
Django框架反向解析操作详解
2019/11/28 Python
python3中确保枚举值代码分析
2020/12/02 Python
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
中文专业求职信
2014/06/20 职场文书
销售员岗位职责
2015/02/10 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
计划生育目标责任书
2015/05/09 职场文书
教师节随笔
2015/08/15 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL