setTimeout——内存泄漏

    xiaoxiao2021-03-25  230

    写了个定时器,突发奇想,将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一栏蓝色的线是锯齿、或者梯形等波动起伏大的形状,就要看看代码哪里有明显的问题了。

    关注公众号回复“资料”即可获得为您精心准备的前端视频学习资料

    转载请注明原文地址: https://ju.6miu.com/read-25396.html

    最新回复(0)