写了个定时器,突发奇想,将setTimeout(function,n)放至function 函数内(function函数外已经用setTimeout调用了function函数)。
function dd() {
/*此处省略*/
Mycheck=setTimeout(dd,n);
//、、
setTimeout(dd,n)
}
div1.onmouseover=function () {
clearTimeout(Mycheck);
};
div1.onmouseout=function () {
Mycheck=setTmoveeout(dd,n);
}
执行一看,嘿~~~效果还不错没故障目光转向右下角顿时傻眼(⊙o⊙)~
加速球数值飙升啊~
我那个去,心中万匹草泥马飞过…直到浏览器页面如下图所示
,这丫都内存泄漏了~
查看如图
这丫上了一个阶梯后就不下来了,霸占着内存,居高临下
这锯齿形图案完美装饰着俺的浏览器~
setTimeout本身只执行函数一次,由于在setTimeout需要调用的函数内部引用了这个setTimeout,引用没被清除,内存一直占用来不及回收,此时分配给页面的内存告急,你丫只给我这么一点内存还不腾出个地儿来让我喘口气?——
使用setTimeout一般不会出现内存泄漏的现象(使用规范),但是如果和其他函数在一起,形成了闭包就难逃内存泄漏了。
---------------------------------------分割线----------------------------
时隔几个月再看这篇博客的时候发现了比较严重的问题:
- 问题描述不清楚,可以说明的例子太少。(俺自己看着一脸懵×)
- 没深入研究
再次看这篇博文感觉需要总结几点:(当时啥代码也忘了)
1.可能会出现内存泄露的情况有:1)循环引用,内存没释放。
比如:
DOM 元素通过触发onclick直接引用匿名function,并且这个function引用了elem元素通过外部的词法环境,引用并没有释放。这小size的引用或许不会造成什么影响也不会显示出来(IE低版本可能需要清除),如果在点击触发的匿名函数里是一大串操作数据显示的代码,比如图表,在反复切换点击时泄露就会很明显了。上一次点击载入的一些变量和引用没有得到释放。这时可以使点击为null。document.οnclick=null;
2.没有清除定时器。
如何查看内存泄露呢。
1。如果泄露得很明显,那一眼就看出来了,比如浏览器崩溃、CPU飙升(可以看360加速球)。
2。控置台的performance查看,如果cpu一栏蓝色的线是锯齿、或者梯形等波动起伏大的形状,就要看看代码哪里有明显的问题了。
关注公众号回复“资料”即可获得为您精心准备的前端视频学习资料