JavaScript定时函数中的延迟工作原理
JavaScript提供了两个广泛使用的定时函数,setTimeout()
和setInterval()
。这两个函数都会在指定的时间之后执行指定的函数,可以是一次或者重复执行。虽然这很简单,但很多人并不意识到延迟只是一个建议,可以受到多种因素的影响而改变。
延迟不是精确的
我在事件循环解释中详细介绍了JavaScript引擎如何执行代码,但在这里让我简要回顾一下。由于JavaScript是单线程的,任务会被排队在一个循环中执行。因此,setTimeout()
和setInterval()
是任务,在至少经过给定的时间后执行。然而,并不能保证任务会在给定的时间后精确执行。延迟只是一个建议,表示任务执行之前必须经过的最短时间。实际的延迟可能会更长,这取决于JavaScript引擎的当前状态。
浏览器因素
除了与引擎相关的延迟之外,还有一些其他因素会影响任务的实际延迟。简要来说,这些因素包括:
- 浏览器会对嵌套的超时和间隔进行节流处理,至少延迟4毫秒,但这可能因浏览器而异。
- 非活动/后台标签中的超时和间隔会被节流处理,最小延迟为1000毫秒,以延长电池寿命。
- 已知的后台标签中的跟踪脚本在一定时间后可能会被进一步节流处理。
另外,一些浏览器将延迟存储为32位有符号整数,这意味着超过24.8天的延迟会导致溢出并立即执行。