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源码分析之Event事件分析
Jun 07 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
Jul 31 Javascript
JQuery学习笔录 简单的JQuery
Apr 09 Javascript
JS限制上传图片大小不使用控件在本地实现
Dec 19 Javascript
在ASP.NET中使用JavaScript脚本的方法
Nov 12 Javascript
学习JavaScript设计模式(多态)
Nov 25 Javascript
AngularJS基础 ng-options 指令详解
Aug 02 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
微信小程序实现留言板(Storage)
Nov 02 Javascript
小程序实现授权登陆的解决方案
Dec 02 Javascript
浅谈express.js框架中间件(middleware)
Apr 07 Javascript
jQuery+ajax实现批量删除功能完整示例
Jun 06 jQuery
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实现的遍历文件夹下所有文件,编辑删除
2010/01/05 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
分享php多功能图片处理类
2016/05/15 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
javascript实现信息的显示和隐藏如注册页面
2013/12/03 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
H5 js点击按钮复制文本到粘贴板
2020/11/19 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
python的concat等多种用法详解
2018/11/28 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
印刷工程专业应届生求职信
2013/09/29 职场文书
晚宴邀请函范文
2014/01/15 职场文书
忠诚教育心得体会
2014/09/03 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
三八妇女节慰问信
2015/02/14 职场文书
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript