4.setInterval需要注意的点,使用settimeout实现setInterval

setInterval需要注意的点,使用settimeout实现setInterval

setTimeout传入的是两个参数,第一个参数是cb代表的是回调函数callback,第二个代表的是时间,以ms计算

setInterval传入的也是两个参数,第一个参数是cb代表的是回调函数callback,第二个代表的也是时间,以ms计算

区别和注意点

setTimeout含义是定时器,到达一定的时间触发一次,但是setInterval含义是计时器,到达一定时间触发一次,并且会持续触发

setInterval问题:当前执行栈执行的时间很长,导致事件队列里边积累多个定时器加入的事件,当执行栈结束后,这些事件会依次执行而之间没有任何停顿,不能达到间隔一段时间执行的效果

  • 幸好,JavaScript 引擎够聪明,能避免这个问题。当使用 setInterval()时,仅当没有该定时器的任何其他代码实例时,才将定时器代码添加到队列中
  • 这种重复定时器的问题在于
    某些间隔会被跳过
    多个定时器的代码执行之间的间隔可能会比预期的小。
    假设,某个 onclick 事件处理程序使用 setInterval()设置了一个 200ms 间隔的重复定时器。如果事件处理程序花了 300ms 多一点的时间完成,同时定时器代码也花了差不多的时间,就会同时出现跳过间隔且连续运行定时器代码的情况。

我们使用setTimeOut递归调用实现setInterval

let fn = () => {
console.log('执行SI');
}
function setTimeToInterval(fn, delay, times) {
  if (!times) {
    return
  }
  setTimeout(() => {
    fn()
    setTimeToInterval(fn, delay, --times)
  }, delay)
}
setTimeToInterval(fn, 2000, 3)

 

posted @ 2023-03-04 22:06  不想做混子的奋斗远  阅读(94)  评论(0)    收藏  举报