javascript - settimeout 模拟setInterval内存释放问题
PHPz
PHPz 2017-04-10 16:07:13
[JavaScript讨论组]
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分钟的定时器

PHPz
PHPz

学习是最好的投资!

全部回复(2)
大家讲道理

没有必要,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时

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号