JS内存泄漏几个实例的详细讨论

JS内存泄漏几个实例的详细讨论
A memory leak means that a piece of allocated memory is neither used nor recycled until the end of the browser process.In C++, memory leakage is a frequent occurrence because of the manual management of memory.The popular languages such as C# and Java use automatic garbage collection methods to manage memory, and there will be little memory leaks in normal use.In browsers, automatic garbage collection is also used to manage memory, but because the browser garbage collection method has bug, the memory leak will be generated.

1,当删除替换页面中的元素时,如果不删除元素绑定事件,则不会在IE中正确处理,首先,手动删除事件,否则将出现内存泄漏。
复制代码代码如下所示:

VaR建立document.getelementbyid(mybtn );
btn.onclick =函数(){
document.getelementbyid(mydiv ).innerHTML =处理…;
}
应将其更改为以下内容
复制代码代码如下所示:

VaR建立document.getelementbyid(mybtn );
btn.onclick =函数(){
btn.onclick = null;
document.getelementbyid(mydiv ).innerHTML =处理…;
}
或事件委托的使用
复制代码代码如下所示:

onclick =函数(事件){
事件=事件window.event | |;
如果(event.target.id = = mybtn){
document.getelementbyid(mydiv ).innerHTML =处理…;
}
}
2,
复制代码代码如下所示:
创建一个document.getelementbyid(# XX);
var b = document.getelementbyid(# XXX);
AR = B;
b.r =一;

复制代码代码如下所示:
创建一个document.getelementbyid(# XX);
AR =一;

纯ECMAscript对象,只要没有其他对象引用的对象,A或B,即仅指对方,他们仍然会被垃圾收集处理系统。然而,在Internet Explorer中,如果在循环引用的任何对象的DOM节点或ActiveX对象,垃圾收集系统没有发现系统中与其他对象之间的循环关系的分离和释放。他们最终会被保存在内存中直到浏览关闭
三,
复制代码代码如下所示:
var elem = document.getelementbyid(测试);
elem.addeventlistener(听到咔哒声,函数(){(){
提醒(你点击' +元素。tagname);
});

此代码注册一个匿名函数作为一个Click事件处理函数的DOM节点,指的是一个DOM对象,元素,形成一个闭合。这将产生循环引用,即:DOM -> -> ->关闭关闭DOM DOM对象中…不会关闭和关闭发布之前发布的;作为一个DOM对象的事件处理函数,所以在发布前关闭不会释放DOM对象,即使在DOM树中的DOM对象删除,因为存在循环引用,DOM对象和关闭不会被释放。可以通过以下方法为了避免这种内存泄漏
复制代码代码如下所示:
var elem = document.getelementbyid(测试);
elem.addeventlistener(听到咔哒声,函数(){(){
提醒(你点击' +本。tagname); / /没有直接引用变量元素
});

4,
复制代码代码如下所示:
bindevent()函数
{
var obj = document.createelement(XXX);
obj。onclick =函数(){
即使是空函数
}
}

闭包很容易形成循环引用。如果构成闭包的函数对象被分配给事件处理程序(如DOM节点),并且在函数对象作用域中分配给节点(或变量)对象的引用,则有一个循环引用。
dom_node.onevent - < function_object。{ { } }〈scope_chain范围- < activation_object.noderef - < dom_node。

很容易形成这样一个循环引用。浏览包含类似循环引用代码的网站(通常出现在网站的每一页),将消耗大量(甚至全部)的系统内存。
解决方案是在外部定义事件处理函数并删除闭包。
复制代码代码如下所示:
bindevent()函数
{
var obj = document.createelement(XXX);
onclick= onclickhandler OBJ;
}
功能onclickhandler(){
做某事
}

或者在定义事件处理函数函数的外部函数中,删除对DOM的引用。在Javascript权限指南中,可以删除范围中的无用属性以减少内存消耗。
复制代码代码如下所示:
bindevent()函数
{
var obj = document.createelement(XXX);
obj。onclick =函数(){
即使是空函数
}
obj = null;
}

5,
复制代码代码如下所示:
a:{:{ 1 };
B = P;
删除一个P;

执行此代码后,对b.x值仍然是1,因为删除属性引用仍然存在。因此,在Javascript的一些实现中,由于这种不精确的代码可能会导致内存泄漏,因此当对象被破坏时,您必须遍历属性中的属性,并依次删除它。
6。自动装箱转换
不要相信下面的代码会导致IE系列内存泄漏。
复制代码代码如下所示:
var =啦啦啦;
警报(s.length);

s本身是字符串而不是对象。它没有长度属性。因此,当访问长度时,js引擎会自动创建一个临时字符串对象来封装s,它肯定会泄漏。这个bug是不可想象的,很容易解决,记住所有的值类型
复制代码代码如下所示:
var s =啦啦啦;
警报(新字符串(s)长度);

7。一些DOM操作
IE系列特殊问题的根本是DOM元素appendChild不在DOM树。在IE7中,以提高内存泄漏,IE7采用极端的解决方案:从所有的DOM树离开页面时,所有元素的回收,并忽略所有其他人。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部