关于setTimeout
定时器是存放在延迟队列中,当队列中的当前宏任务执行完毕后,会检查延迟队列中到期的任务,取出到期的任务挨个执行。
如下代码:
function showName(){
console.log("极客时间")
}
var timerID = setTimeout(showName, 200);
当js调用setTimeout
生成一个定时器,渲染进程会生成一个回调任务(任务包括了回调函数showName
、创建时间、延迟时间),加入到延迟队列中。
综上概述,由于消息队列排队和一些系统级别的限制,setTimeout
回调执行的时间一定会大于等于设置的时间。
如果定时器存在嵌套调用,当嵌套数量为5个以上时,系统会设置最短时间间隔为4毫秒,原因是当调用5次以上时,系统会判定该方法被阻塞了,如果定时器调用时间间隔小于4毫秒,那么,浏览器会将每次调用的时间间隔设置为4毫秒。
未激活的页面,setTimeout
执行最小间隔是1000毫秒。
定时器可以设置的最大时间为2147363847
毫秒,因为浏览器是用32个bit来存放延迟值的,32bit最大只能存放的数字为2147363847
,这意味着setTimeout
最大可以设置的时间大约为24.8天。当setTimeout
设置的延迟值大于2147363847
时就会溢出,相当于延迟值被设置为0
,你可执行如下代码,其会立即执行,验证该现象。
function showName(){
console.log("极客时间")
}
var timerID = setTimeout(showName,2147483648); //会被立即调用执行
整理自:极客时间《浏览器工作原理与实践》
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=3137