在渲染进程中有一个定时器触发线程,该线程的主要工作就是计时。比如:
setTimeout(()=>{
console.log('test');
}, 0)
这段代码设置的时间为0毫秒,并不是说它立即执行,它执行的过程时这样的:
- ja引擎在执行整个文件的代码时,遇到了setTimeout这段代码,然后执行,并把回调函数放进定时器触发线程维护的队列中,开始计时。
- 当时间达到之后,该定时器触发线程会将该回调函数放到消息队列中(主线程一直执行消息队列中的任务),等待js引擎的执行。
由此可见,虽然setTimeout设置的时间是0,但执行时间并不一定是立即执行,这要看js引擎是否空闲。除此之外,如果setTimeout回调之前的任务执行时间过长,也会造成回调的延迟执行。
当setTimout嵌套的个数小于等于5个时,setTimout会按照时间顺序执行,当嵌套大于5个时,chrome浏览器就认为该函数被阻塞了,所以每次调用的时间间隔最小为4毫秒。
注意:
- 未激活页面(tab打开,但不是激活状态)时,setTimeout的最小时间间隔为1000毫秒,这主要是为了优化后台的加载损耗和耗电情况。
- 执行时间是有一个最大值的,为2147483647毫秒,约等于24.8天,当大于这个值时,相当于置0了。
- 当在setTimeout里面使用this时,这个this默认是指向全局对象的,我的理解是绑定丢失了。可以将this在外部进行存储,或者回调函数使用箭头函数,在或者在回调函数里面使用bind或call进行显式绑定。