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不会自动回收xmlHttpRequest对象 导致了内存溢出
Jun 18 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
Jul 09 Javascript
删除javascript所创建子节点的方法
May 21 Javascript
jQuery根据元素值删除数组元素的方法
Jun 24 Javascript
jQuery实现简单的文件上传进度条效果
Mar 26 Javascript
JS实现支持Ajax验证的表单插件
Mar 24 Javascript
JavaScript实现移动端滑动选择日期功能
Jun 21 Javascript
seajs中模块依赖的加载处理实例分析
Oct 10 Javascript
bootstrap可编辑下拉框jquery.editable-select
Oct 12 jQuery
webstrom Debug 调试vue项目的方法步骤
Jul 17 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
May 17 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
May 18 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 Directory 函数的详解
2013/03/07 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
php实现当前页面点击下载文件的实例代码
2016/11/16 PHP
php二维码生成以及下载实现
2017/09/28 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
简单JS代码压缩器
2006/10/12 Javascript
一句话JavaScript表单验证代码
2009/08/02 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
Python中Collection的使用小技巧
2014/08/18 Python
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
表彰会主持词
2014/03/26 职场文书
ktv筹备计划书
2014/05/03 职场文书
新闻人物通讯稿
2014/10/09 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
Python制作春联的示例代码
2022/01/22 Python
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python
Python获取字典中某个key的value
2022/04/13 Python
python高温预警数据获取实例
2022/07/23 Python