在使用 setTimeout() 时,一般都会比设定的时间要稍微长一点,即使是 setTimeout(fn, 0) 也不会立即执行。造成这种问题的根本原因是: 最小延迟时间。
有很多因素会导致setTimeout的回调函数执行比设定的预期值更久,本节将讨论最常见的原因。
最小延时 >= 4ms
在浏览器中,setTimeout()/setInterval() 的每调用一次定时器的最小间隔是4ms,这通常是由于函数嵌套导致(嵌套层级达到一定深度),或者是由于已经执行的setInterval的回调函数阻塞导致的。例如:
function cb() { f(); setTimeout(cb, 0); }
setTimeout(cb, 0);
setInterval(f, 0);
在Chrome 和 Firefox中, 定时器的第5次调用被阻塞了;在Safari是在第6次;Edge是在第3次。Gecko 从这个版本 version 56开始对 setInterval() 开始采用这样的机制(setTimeout()已经实现,具体请参考以下内容)。
一直以来,不同浏览器中出现这种最小延迟的情况有所不同(例如Firefox) - 从其他地方调用了setInterval( ),或者在嵌套函数调用setTimeout( ) 时(嵌套级别达到特定深度时),都会出现超时延迟。
如果想在浏览器中实现0ms延时的定时器,你可以参考

最低0.47元/天 解锁文章
401

被折叠的 条评论
为什么被折叠?



