经过一上午的艰苦试验验证,得出如下结论:
1、将元素传入闭包,并在其中注册事件,这是导致内存泄露的根源之一;另一必要条件是:元素必须脱离文档树,亦即类似执行了语句:
elm.parentNode.removeChild(elm)
。
2、解决方式:避免上述情形;在window.onunload中取消事件注册。
示例如下:
1、
<div id="test" style="border:1px solid blue;width:100px;height:100px;"></div>
<input type="button" value="leak" onclick="leak()" />
<script><!--
var test=document.getElementById('test');
var global = {};
(function(test){
global.handler=handler;
document.getElementById('test').attachEvent('onclick',handler);
function handler(){};
})(test);//将test传入闭包
window.attachEvent('onunload',function(){
test.detachEvent('onclick',global.handler);//可消除内存泄露
});
function leak(){//执行此句,使test脱离document树.
document.body.removeChild(document.getElementById('test'));
}
//--</script>
以上是dom2的事件注册方式,再来看看dom1的:
<div id="test" style="border:1px solid blue;width:100px;height:100px;"></div>
<input type="button" value="leak" onclick="leak()" />
<script><!--
var test=document.getElementById('test');
(function(test){
document.getElementById('test').onclick=hander;
function hander(){};
})(test);//将test传入闭包
window.attachEvent('onunload',function(){
test.onclick=null;//对应dom1
});
function leak(){
document.body.removeChild(document.getElementById('test'));
}
//--</script>
当然,如果你愿意,完全可以把'onclick'换成任意一个你喜欢的属性:
<div id="test" style="border:1px solid blue;width:100px;height:100px;"></div>
<input type="button" value="leak" onclick="leak()" />
<script><!--
var test=document.getElementById('test');
(function(test){
function hander(){};
document.getElementById('test').ss=hander;
})(test);
window.attachEvent('onunload',function(){
test.ss=null;//可防止泄露,没有这句定然泄露
});
function leak(){
document.body.removeChild(document.getElementById('test'));
}
//--</script>
如果不把test传入闭包,则不会泄露:
var test=document.getElementById('test');
(function(){
document.getElementById('test').onclick=hander;
function hander(){};
})();//不将test传入闭包
当然,如果这个元素始终在doucument树中,也不会泄露:
function leak(){
//注释了下面这句
//document.body.removeChild(document.getElementById('test'));
}
最后,如果你这么写,当然也不会泄露:
<div id="test" style="border:1px solid blue;width:100px;height:100px;"></div>
<input type="button" value="leak" onclick="leak()" />
<script><!--
var test=document.getElementById('test');
function hander(){};
test.onclick=hander;
//--</script>
总结:IE事件模型内存泄露的本质其实就是元素、作用域、事件处理函数之间循环引用。
var test=document.getElementById('test');
(function(test){//作用域A
document.getElementById('test').onclick=hander;
function hander(){
//作用域B
};
})(test);//将test传入闭包
//A引用test,test引用了hander,hander通过作用域B又引用了A,形成了回路。
//由此可以引出如下例子,它也会泄露:
(function(){//作用域A
var test=document.createElement('dl');
test.onclick=hander;
function hander(){
//作用域B
};
})();
分享到:
相关推荐
对于从事IE相关开发或者需要处理遗留IE项目的人来说,"ie内存泄露监控软件"是一个非常实用的工具,值得尝试和依赖。同时,了解内存管理和优化技术也是提升软件质量的关键技能之一,对于任何编程人员来说都是一个有益...
标题"测试JavaScript在IE中的内存泄露"表明我们将讨论如何检测和分析JavaScript在IE浏览器中的内存泄露问题。在IE中,由于其JavaScript引擎(JScript)的一些特性,如活动对象模型(ActiveXObject)和遗留的COM组件...
标题中的“IE内存泄露分析工具:sIEve/Drip”指的是两个专门用于检测和分析Internet Explorer浏览器内存泄漏问题的工具。sIEve和Drip是独立的工具,但它们都致力于帮助开发者定位和解决IE浏览器中的内存管理问题。 ...
总结来说,sIEve-0.0.8是解决IE内存泄露问题的重要工具,它通过提供深入的内存分析报告,使得开发者能够更有效地调试和优化IE应用程序,从而提升用户浏览体验。对于那些仍然依赖IE或需要处理遗留IE项目的人来说,...
**sIEve IE内存泄露监控详解** `sIEve IE内存泄露监控` 是一款专注于检测和分析Internet Explorer(简称IE)浏览器内存泄漏问题的工具。它作为一个绿色软件,无需安装即可直接运行,为用户提供了一种方便的方式来...
总结来说,"脚本IE内存泄露检测.rar"是一个专为Internet Explorer设计的JavaScript内存泄漏检测工具,可以帮助开发者识别和解决JavaScript代码中的内存管理问题,提高应用程序的性能和稳定性。使用该工具需要运行...
JavaScript内存泄露问题的解析 JavaScript内存泄露问题是一种常见的bug,它会导致系统崩溃和性能下降。内存泄露是指系统不能正确地管理内存分配的情况,这可能会导致程序调用失败、执行减慢等问题。 在JavaScript...
JavaScript内存泄露是一个重要的性能优化话题,尤其是在...对于IE浏览器,由于其早期版本的垃圾收集机制不完善,内存泄露问题更为突出,文档《理解并解决IE的内存泄漏方式》可能会提供更具体的针对IE浏览器的解决方案。
当DOM元素被移除后,如果事件监听器没有被清除,那么这个DOM元素以及相关的JavaScript对象将不会被垃圾回收,从而导致内存泄露。 ### 解决方案 #### 断开循环引用 为了解决内存泄露,首要任务是断开DOM元素与...
在早期版本的Internet Explorer(如IE6)中,存在一种特殊的内存泄露情况,即当DOM元素或ActiveX对象与普通的JavaScript对象之间存在循环引用时,IE在释放这类变量时存在特殊困难,导致内存无法正常回收。...
内存泄露检测工具 内存泄露是指计算机程序在运行过程中,无法释放已经分配的内存空间,从而导致内存泄露的现象。内存泄露检测工具是用于检测和解决内存泄露问题的软件工具。以下是常用的内存泄露检测工具: 1. ...
**IE浏览器内存泄漏详解** IE浏览器,全称Internet Explorer,是微软公司开发的一款经典网络浏览工具。在过去的几十年里,IE浏览器曾是全球最广泛使用的浏览器之一。然而,随着技术的发展,IE浏览器的一些问题逐渐...
这样可以确保与这些元素相关的所有句柄都被解除,防止内存泄露。此外,对于JQuery的使用,可以尝试更新到最新版本,因为新版本的JQuery通常会修复已知的内存管理问题,包括针对IE的优化。 在分析这个问题时,我们...
通常,内存泄露在JavaScript中发生是因为动态创建的元素、事件处理函数或其他资源没有被正确地清理和释放。 jQuery库在处理DOM操作和事件绑定时,如果不注意,可能会引发内存泄漏。例如: 1. **事件监听器**:当...
Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...
标题“IE内存泄露”指的是在使用Internet Explorer浏览器时,由于程序设计或实现的缺陷,导致内存资源无法正确释放,从而持续占用系统内存,随着时间推移可能导致系统性能下降甚至崩溃的问题。这种现象在早期版本的...
sIEve-0.0.8.exe很可能是一款内存分析工具,可能专注于对Internet Explorer浏览器的内存使用情况进行检测,因为其名称中包含了“IE”字样。这种工具通常会提供实时内存使用图表,显示内存分配和释放的情况,以及可能...
IE在早期版本中有一个著名的内存泄露问题,当DOM节点和JavaScript对象通过事件监听器或其他方式相互引用时,即使这些元素从DOM树中移除,由于循环引用的存在,它们的内存不会被释放。解决这个问题的方法是手动解除...
了解并掌握"ie事件捕获控件"的相关技术,可以帮助开发者更深入地理解浏览器行为,提升Web应用的安全性和用户体验。同时,随着现代浏览器对标准支持的增强,类似的功能也可以应用到Firefox、Chrome等非IE浏览器上,...