关于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); //会被立即调用执行

整理自:极客时间《浏览器工作原理与实践

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注