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来实现动画导航效果的代码
Dec 16 Javascript
JavaScript 组件之旅(一)分析和设计
Oct 28 Javascript
将CKfinder整合进CKEditor3.0的新方法
Jan 10 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
Dec 06 Javascript
Extjs优化(一)删除冗余代码提高运行速度
Apr 15 Javascript
推荐5 个常用的JavaScript调试技巧
Jan 08 Javascript
javascript中递归函数用法注意点
Jul 30 Javascript
谈一谈JS消息机制和事件机制的理解
Apr 14 Javascript
基于vue实现移动端圆形旋钮插件效果
Nov 28 Javascript
vue实现直播间点赞飘心效果的示例代码
Sep 20 Javascript
前端如何实现动画过渡效果
Feb 05 Javascript
React中的Context应用场景分析
Jun 11 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
zend api扩展的php对象的autoload工具
2011/04/18 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
经验几则 推荐
2006/09/05 Javascript
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
2009/11/11 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
Python高效编程技巧
2013/01/07 Python
Python import自定义模块方法
2015/02/12 Python
Python中的默认参数详解
2015/06/24 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
Tensorflow的常用矩阵生成方式
2020/01/04 Python
mac使用python识别图形验证码功能
2020/01/10 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
酒店应聘自荐信
2013/11/09 职场文书
内勤岗位职责
2015/02/10 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
redis复制有可能碰到的问题汇总
2022/04/03 Redis