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 相关文章推荐
页面调用单个swf文件,嵌套出多个方法。
Nov 21 Javascript
js中通过父级进行查找定位元素
Jun 15 Javascript
jquery不常用方法汇总
Jul 26 Javascript
jQuery hover事件简单实现同时绑定2个方法
Jun 07 Javascript
JavaScript探测CSS动画是否已经完成的方法
Aug 30 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
Oct 30 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
Dec 28 Javascript
js canvas实现QQ拨打电话特效
May 10 Javascript
jquery实现图片放大点击切换
Jun 06 jQuery
angular2路由之routerLinkActive指令【推荐】
May 30 Javascript
浅谈layui 绑定form submit提交表单的注意事项
Oct 25 Javascript
ES6 async、await的基本使用方法示例
Jun 06 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 启动报错如何解决
2014/01/17 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
python实现汉诺塔方法汇总
2016/07/25 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
python图像和办公文档处理总结
2019/05/28 Python
PyQt5实现简易电子词典
2019/06/25 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
奥地利网上书店:Weltbild
2017/07/14 全球购物
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
this关键字的作用
2016/01/30 面试题
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
医药工作者的求职信范文
2013/09/21 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
开业主持词
2014/03/21 职场文书
青年文明号口号
2014/06/17 职场文书
药店收银员岗位职责
2015/04/07 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python