为了账号安全,请及时绑定邮箱和手机立即绑定

settimeout 模拟setInterval内存释放问题

settimeout 模拟setInterval内存释放问题

拉莫斯之舞 2019-04-21 20:15:22
vart=function(a){var_this=this;this.timer=function(_a){setTimeout(function(){//TODO条件成立_this.timer(_a);},1000);}};没有清理vart=function(a,_t){var_this=this;this.timer=function(_a,_t){_t&&clearTimeout(_t);vart=setTimeout(function(){//TODO条件成立_this.timer(_a,t);},1000);}};清理了有必要清理settimeout么?暂定执行10分钟20分钟的定时器
查看完整描述

2 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

没有必要,clearTimeout并不是用来清理内存的,而是用来提前移除之前的setTimeout超时事件。如果setTimeout事件已经发生了,它会自动清理那些已经超过作用域的内存。
                            
查看完整回答
反对 回复 2019-04-21
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

vart=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时
                            
查看完整回答
反对 回复 2019-04-21
  • 2 回答
  • 0 关注
  • 786 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信