JavaScript中setTimeout是否有参考时钟?修改系统时间会影响它吗?
setTimeout的触发时钟与系统时间的关系
你对setTimeout(code, delay)的基础逻辑理解是对的,但它的触发时机并不依赖系统的墙钟时间,而是基于JS引擎(或浏览器)内部的单调递增时钟。
具体细节:
- 调用
setTimeout(fn, delay)时,引擎会记录当前的单调时钟值,加上指定的delay毫秒数,作为回调的触发阈值。 - 单调时钟是只增不减的,不受手动修改系统时间、时区切换、NTP时间同步这类操作的影响。
举个直观的例子:
你设置了一个10秒后执行的setTimeout,运行3秒后把系统时间往后调了1小时,这个回调依然会在剩余的7秒后触发,不会等到1小时后;反过来如果把系统时间往前调1小时,回调也不会提前执行,还是会等满10秒的时长。
唯一的例外情况是系统进入休眠/挂起状态:此时单调时钟会暂停,setTimeout的等待时长会包含系统休眠的时间,直到系统唤醒后才会继续计时。
内容的提问来源于stack exchange,提问作者sudo rm -rf slash
相关产品推荐
相关产品推荐

