先来看下两者的简介:
setTimeout:在指定的毫秒数之后调用函数或计算表达式。
setInterval:按照指定的周期(以毫秒计)来调用函数或计算表达式。
简单理解为setTimeout只执行一次,而setInterval可以按周期一直执行。
setInterval的缺陷
1、推入任务队列后的时间不准确:在 setInterval 被推入任务队列时,如果在它前面有很多任务或者某个任务等待时间较长比如网络请求等,那么这个定时器的执行时间和我们预定它执行的时间可能并不一致。
2、函数操作耗时过长会导致不准确:假如定时器里面的代码需要进行大量的计算(耗费时间较长),或者是 DOM 操作。这样一来,花的时间就比较长,有可能前一次代码还没有执行完,后一次代码就被添加到队列了。也会导致定时器变得不准确,甚至出现同一时间执行两次的情况
所以我们通常会希望使用setTimeout实现setInterval,因为:每个 setTimeout 产生的任务会直接 push 到任务队列中
利用setTimeout实现setInterval
function mySetTimeout(func,delay){
//声明timer,用于后面清除定时器
let timer = null
const interval = () =>{
//执行对应传入函数
func()
//用timer接收setTimeout返回的定时器编号
//setTimeout接收in