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)

浙公网安备 33010602011771号