首页 > settimeout 模拟setInterval内存释放问题

settimeout 模拟setInterval内存释放问题

var t=function(a){
    var _this=this;
    this.timer=function(_a){
        setTimeout(function(){
            //TODO条件成立
            _this.timer(_a);
        },1000);
    }
};

没有清理

var t=function(a,_t){
    var _this=this;
    this.timer=function(_a,_t){
        _t&&clearTimeout(_t);
        var t=setTimeout(function(){
            //TODO条件成立
            _this.timer(_a,t);
        },1000);
    }
};

清理了

有必要清理settimeout么?暂定执行10分钟20分钟的定时器


没有必要,clearTimeout并不是用来清理内存的,而是用来提前移除之前的setTimeout超时事件。如果setTimeout事件已经发生了,它会自动清理那些已经超过作用域的内存。


var t=function(a){
    var _this=this;
    this.timer=function(_a){
        setTimeout(function(){
            //TODO条件成立
            _this.timer(_a);
        },1000);
    }
};

以上代码你每个1000+时间就会生成一个定时器,并且定时器是不断的增长,会把你的程序搞爆的哦
t.timer被执行时,生成一个匿名定时器A,每1000+会再执行一次t.timer生成另一个匿名定时器,也是每1000+执行一次的,会生成A1,A2,A3.....定时器的生成是不停的嵌套的,不停的产生
而A1又会A11,A12.....
....
以上回答为错误描述,是基于setInterval的机制下的描述,sorry
@代码宇宙 提醒指正

请参考以下回答:

t.timer被执行1次后,会生成一个新的定时器,加入到javascript的事件循环中。而这个定时器1000+到点触发后会再生成一个定时器。只要程序不停,定时器会不断生成。
那么生成一个新的定时器的原定时器因为已经被调用(时间已经过期),那么定时器将会被自动清除掉,从javascript的事件循环队列中去除,没有被引用进而被GC掉。应用中只会有一个定时器有效,所以清除也没有必要。
除非你想在定时器执行前取消之前的定时器,例如当t.timer的执行间隔比<1000时

【热门文章】
【热门文章】