转自简书https://www.jianshu.com/p/0ad05e325f9b
在自己写轮播图玩的时候遇到了setinterval的问题,在网上查了很久,查到了一个非常满意的解答,并做了验证。
非常感谢作者mingttong,以下为转载内容
在参加360面试的时候面试官问到了这样的一道题:
“setInterval和setTimeout有什么区别”
我当时只说出了最基本的区别——一个是倒计时,一个是循环。面试官一脸淫荡的看着我说:“如果setInterval计时器的回调函数执行完需要5秒,而计时器时间间隔为3秒,那会发生什么?”
嘿呀,我居然没想到这一点,但凭借我扎实的JS功底,这点对我来说不是小事。我告诉他那下一次循环就会插入到队列中,等待着此次循环执行完后再执行。
面试官又是一脸淫荡地看着我,“其实并不会,如果之前的代码还没有执行完,那他就会跳过这次循环,再等3秒执行下一次循环。”
将他说的话整理一下应该是下面这样:
//0s..............................第一次添加定时器
//3s..............................第一次执行定时器代码,并且第二次添加定时器
//6s..............................第二次执行定时器代码失败,跳过此次循环,再次添加第二次定时器
//8s..............................执行完第一次定时器代码
//9s..............................第二次执行定时器代码,并且第三次添加定时器
//12s............................第三次执行定时器代码失败,跳过此次循环,再次添加第三次定时器
//14s............................执行完第二次定时器代码
“如果之前回调没有执行完,则不能再次执行当前回调,因此会跳过此次回调”
被面试官鄙视了一番,很沮丧。面试官告诉我在《高程3》中写有这部分的内容,让我回去好好看。
回来我就看了一下这部分内容,具体位置在P610的“22.3.1 重复的定时器”,书上是这么说的:
当使用setInterval()时,仅当没有该定时器的任何其他代码示例时,才将定时器代码添加到队列中。这确保了定时器代码加入到队列中的最小时间间隔为指定间隔
今天还和小伙伴们讨论了一番,但我发现我有点误解这段话的意思。
有几个关键词——定时器代码、队列。
其实就是说,当我定时器到了指定时间后,要执行这一波代码时,如果上一波定时器代码还没有完全执行完的话,我就不会执行我这一波代码,也不会将他加入到队列中排队,而是调到下一波倒计时。
看来面试官没蒙我,但是想起他那淫荡的表情我又有些不敢相信,于是我自己做了次试验。
让程序滞留固定时间的方法如下:
function