内存泄漏是指不能再使用的内存,没有及时释放
情况1.意外的全局变量
function leaks(){
a = 3;
}
当leaks函数执行完后,由于a是全局变量,所以还存在,没有及时释放。但在严格模式'user strict'
下,严格模式会阻止你创建意外的全局变量
情况2.闭包
function assignHandler(){
let element = document.getElementById("someElement");
element.onclick = function () {
alert(element.id);
};
}
上面的匿名函数就是一个闭包,element元素被该闭包引用,因此无法减少对element的引用数。不过可以解决,如下
function assignHandler(){
let element = document.getElementById("someElement");
let id = element.id;
element.onclick = function () {
alert(id);
};
element = null;
}
通过把element.id的一个副本保存在一个变量中,把element变量设置微null来删除对dom的引用。这样就可以减少对dom的引用数,从而正常回收其占用的内存
情况3.循环引用
循环引用 在引用计数策略下会导致内存泄漏,标记清除不会。
解决办法:手工解除循环引用。
function fn() {
var a = {};
var b = {};
a.pro = b;
b.pro = a;
}
fn();
a和b的引用次数都是2,fn()执行完毕后,两个对象都已经离开环境。
在标记清除方式下是没有问题的,但是在引用计数策略下,a和b的引用次数不为0,不会被垃圾回收器回收内存。如果fn函数被大量调用,就会造成内存泄漏。
情况4
当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>
这里,为了避免双击,单击按钮时将按钮移除并替换成一条消息,相信大家见过这种"操作"。但问题出在,当按钮从页面中移除时,它还带着一个事件处理程序呢
改成下面
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
btn.onclick = null;
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>
http://www.cnblogs.com/sprying/archive/2013/05/31/3109517.html
每天都努力一点点
谢谢你看完