最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • js清除定时器

    正文概述 掘金(healerhe)   2021-03-29   680

    在日常js开发中,若不及时清理定时器,可能会导致内存溢出的风险。所以当我们在使用定时器的时候,就需要考虑在合适的时间清除。

    常见定时器

    • setTimeout(function(){},milliseconds):在特定时间之后调用函数,只调用一次
    • setInterval(function(){},milliseconds):每隔特定的时间调用一次函数,调用n多次,最好不要经常使用
    • setTimeout的销毁函数为clearTimeout
    • setInterval的销毁函数为clearInterval

    clearTimeout(id_of_settimeout)

    定义:阻止/取消 setTimeout() 方法设置的定时执行函数。

    参数:id_of_settimeout是调用 setTimeout() 函数时所返回的ID值,使用该返回标识符作为参数,可以取消该 setTimeout() 所设定的定时执行操作。

    注意: 要使用 clearTimeout(id_of_setinterval) 方法, 在创建执行定时操作时要使用全局变量:

    var myVar = setTimeout(function(){ alert("Hello"); }, 3000);
    clearTimeout(myVar);
    

    是否需要及时清理setTimeOut

    function testTimeout () {
    	console.log('1111')
    	console.log(setTimeout(testTimeout, 3000));
    }
    

    上面代码在递归调用testTimeout,然而setTimeout会一直生成setTimeout对象;虽然会被GC回收但时间不确定,这样做比较危险,可能会导致内存溢出。

    所以我们应该在每次 setTimeout 之前调用 clearTimeout,防止不断创建setTimeout对象而未被GC回收。

    var timeHandle = null;
    function testTimeout () {
        if (timeHandle) {
        	// 调用之前,先清理,防止一直生成对象
        	// ps. setInterval 定时器也应该按这种模式处理
        	clearTimeout(timeHandle);
            timeHandle = null;
        }
    	console.log('1111');
    	console.log(timeHandle = setTimeout(testTimeout, 3000));
    }
    

    clearInterval(id_of_setinterval)

    定义: 可取消/停止由 setInterval() 函数设定的定时执行操作。

    参数:id_of_setinterval是调用 setInterval() 函数时所返回的 ID 值,只有使用该返回标识符作为参数,才可以取消该 setInterval() 所设定的定时执行操作。

    注意: 要使用 clearInterval() 方法, 在创建执行定时操作时要使用全局变量:

    var myVar = setInterval(function(){ myTimer() }, 1000);
    clearInterval(myVar);
    

    是否需要及时清理setInterval

    function testInterval () {
    	console.log('1111')
    	console.log(setInterval(testInterval, 3000));
    }
    

    上面代码在递归调用testInterval,然而setInterval会一直生成setInterval对象;虽然会被GC回收但时间不确定,这样做比较危险,可能会导致内存溢出。

    所以我们应该在每次 setInterval 之前调用 clearInterval,防止不断创建setInterval对象而未被GC回收。

    var timeHandle = null;
    function testInterval () {
        if (timeHandle) {
        	// 调用之前,先清理,防止一直生成对象
        	clearInterval(timeHandle);
            timeHandle = null;
        }
    	console.log('1111');
    	console.log(timeHandle = setInterval(testInterval, 3000));
    }
    

    tips:使用setTimeout模拟setInterval行为

    通常情况下:递归的方式使用setTimeOut(),效果相当于使用setInterval()

    好处:

    1. 简化代码
    2. 保证异步队列的函数调用顺序的精准度,setInterval的缺陷会导致数据量大的时候,异步队列的函数调用出现执行顺序的错乱。比如这个函数还没执行完又开始执行下一个,递归则不会,递归是当前函数执行完才在栈空间递归创建函数的下一个实体并调用。
    //实现的方法挺简单的 ,如下代码
    //参数: 毫秒  需要执行的方法
    function console1() {
        console.log(111);
        if(timer){
            clearTimeout(timer);
        }
        timer = setTimeout(function(){
            console1();
        }, 3000);
    }
    console1()
    

    起源地下载网 » js清除定时器

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元