在日常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()
好处:
- 简化代码
- 保证异步队列的函数调用顺序的精准度,setInterval的缺陷会导致数据量大的时候,异步队列的函数调用出现执行顺序的错乱。比如这个函数还没执行完又开始执行下一个,递归则不会,递归是当前函数执行完才在栈空间递归创建函数的下一个实体并调用。
//实现的方法挺简单的 ,如下代码
//参数: 毫秒 需要执行的方法
function console1() {
console.log(111);
if(timer){
clearTimeout(timer);
}
timer = setTimeout(function(){
console1();
}, 3000);
}
console1()
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!