1. 二者的区别
setTimeout 是只执行1次,setInterval 是重复执行
2. setInterval 存在的缺点
-
setInterval 是间隔固定时间把任务放到任务队列里面,而不是等前一个任务完成了才间隔固定时间把任务放到任务队列里。
-
这样会导致的问题是:如果上一个任务需要执行很长一段时间,那么第一个任务跟第二个任务执行的间隔就不是设置的固定长度了,第二个任务会在第一个任务结束后立马执行了。
-
而且 setInterval 的机制是在放进任务队列之前,会判断任务队列里面是否有上次的任务还没被执行,如果有的话,这次任务就会被跳过
-
总结两个缺点:
1. 可能多个定时器会连续执行
2. 某些间隔会被跳过
3. 具体实现
采用 setTimeout 来实现 setInterval, 通过递归的方式 (这样可以保证,上一个任务结束后,固定时间之后再把下一个任务放到任务队列里面)
function defInterval(fn, time) {
function insideFn() {
fn();
setTimeout(insideFn, time);
}
// insideFn(); // 这样写也可以,但是第一次调用的时候就不是先放进任务队列里等待
setTimeout(insideFn,time) // 所以这样写更符合逻辑
}
defInterval(() => {
console.log('执行了');
}, 1000);