setTimeout——内存泄漏

写了个定时器,突发奇想,将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⊙)~
加速球数值飙升啊~

我那个去,心中万匹草泥马飞过…直到浏览器页面如下图所示
这里写图片描述

,这丫都内存泄漏了~
查看如图
head
这丫上了一个阶梯后就不下来了,霸占着内存,居高临下

这锯齿形图案完美装饰着俺的浏览器~
内存泄漏

setTimeout本身只执行函数一次,由于在setTimeout需要调用的函数内部引用了这个setTimeout,引用没被清除,内存一直占用来不及回收,此时分配给页面的内存告急,你丫只给我这么一点内存还不腾出个地儿来让我喘口气?——

使用setTimeout一般不会出现内存泄漏的现象(使用规范),但是如果和其他函数在一起,形成了闭包就难逃内存泄漏了。

---------------------------------------分割线----------------------------

时隔几个月再看这篇博客的时候发现了比较严重的问题:

  1. 问题描述不清楚,可以说明的例子太少。(俺自己看着一脸懵×)
  2. 没深入研究

再次看这篇博文感觉需要总结几点:(当时啥代码也忘了)
1.可能会出现内存泄露的情况有:1)循环引用,内存没释放。
比如:
这里写图片描述
DOM 元素通过触发onclick直接引用匿名function,并且这个function引用了elem元素通过外部的词法环境,引用并没有释放。这小size的引用或许不会造成什么影响也不会显示出来(IE低版本可能需要清除),如果在点击触发的匿名函数里是一大串操作数据显示的代码,比如图表,在反复切换点击时泄露就会很明显了。上一次点击载入的一些变量和引用没有得到释放。这时可以使点击为null。document.οnclick=null;

2.没有清除定时器。

如何查看内存泄露呢。
1。如果泄露得很明显,那一眼就看出来了,比如浏览器崩溃、CPU飙升(可以看360加速球)。
2。控置台的performance查看,如果cpu一栏蓝色的线是锯齿、或者梯形等波动起伏大的形状,就要看看代码哪里有明显的问题了。

关注公众号回复“资料”即可获得为您精心准备的前端视频学习资料
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在中,内存泄漏是指不再需要的内存没有被正确释放,导致内存占用不断增加,最终导致程序性能下降或崩溃。引起内存泄漏的原因有很多,以下是一些常见的原因: 1. 意外地创建全局变量:如果在函数中没有使用var、let或const关键字声明变量,那么该变量将成为全局变量,即使函数执行完毕后也不会被回收。 2. 定时器未清除:如果在使用setInterval或setTimeout创建定时器后,没有及时清除定时器,那么定时器中引用的函数和变量将不会被释放。 3. 闭包中引用的外部变量未释放:闭包是指一个函数与其相关的引用环境组合的组合体。如果一个函数内部定义了一个函数,并且内部函数引用了外部函数的变量,那么即使外部函数执行完毕,内部函数仍然保持对外部函数变量的引用,导致内存泄漏。 4. DOM元素引用未释放:在JavaScript中,通过getElementById等方法获取的DOM元素,如果在程序执行完毕后没有及时释放对该元素的引用,那么该元素将无法被垃圾回收机制回收。 为了避免内存泄漏,可以采取以下措施: 1. 在函数中使用var、let或const关键字声明变量,避免意外地创建全局变量。 2. 在使用定时器后,及时清除定时器,避免定时器中引用的函数和变量无法被释放。 3. 尽量避免使用闭包,或者在使用闭包时,确保闭包中引用的外部变量在不再需要时能够正确释放。 4. 在使用DOM元素后,及时释放对该元素的引用,可以通过将元素设置为null来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值