目录
一、参数及介绍
setTimeOut
setTimeOut (fn, delayTime)
setInterval
setInterval (fn, interval)
二、工作原理
前言:JS是单线程运行的
setTimeOut
【工作原理】
- JS是单线程执行,当执行到setTimeOut代码时开始计时,在当到达间隔时间delayTime 之后,把回调函数fn放到
事件队列。 - 真正的运行时间取决于主线程何时调用事件队列中fn。(当主线程空闲下来才会去事件队列取出fn函数执行)
运行到 setTimeOut(时间点)| delayTime(时间段) | 调用函数fn(时间点)| fn执行时段(时间段)
setInterval
- 如果没有,则将 fn 加入到事件队列中
- 如果有,那么不会将回调函数 fn 加入到事件队列中,防止之后连续调用 fn(即非定时调用)
弊端:导致一些间隔被跳过
情况一:fn运行时间 ≤ 时间间隔 ,即多数情况
情况二:fn运行时间 > 时间间隔 ,即一些异常情况
为什么会这样?
- JS 为单线程,在一个时间段内全力只作一件事。即执行函数 fn。
- 在 fn 运行的时,定时器没有能力终止其的运行
- 当
fn运行时间 > 时间间隔 interval时,间隔时间到了,但是程序还没有执行完,那也要老老实实的等着函数执行完。
弊端?
- 实际间隔是fn运行的时间,并非设定的时间间隔 interval,时间不精确。
三、setTimeOut弥补setInterval的不足
setTimeout(function fn(){
// 1. 业务逻辑 console.log('Hi') // 2. 链式调用 setTimeout(fn, interval); }, interval);
- 链式调用 setTimeout()
- 每次函数执行的时候都会创建一个新的定时器。
- 第二个setTimeout()调用当前执行的函数,并为其设置另外一个定时器。
- 这样做的好处是,在前一个定时器代码执行完之前,不会向队列插入新的定时器代码,确保不会有任何缺失的间隔。
- 而且,它可以保证在下一次定时器代码执行之前,至少要等待指定的间隔,避免了连续的运行。
四、本文参考文章
排名不分先后
- 为什么setTimeout()比setInterval()稳定
- setInterval和setTimeout的缺陷和优势分析
- 关于JavaScript单线程的一些事
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203942.html原文链接:https://javaforall.net
