setTimeout

setTimeout并没有一开始把回调函数挂在事件循环队列中。它所做的是设定一个定时器。当定时器到时后,宿主环境把回调函数放在事件循环队列中。这样,在未来的某个时刻,js引擎就会去执行这个回调。
如果定时器到时后,事件循环队列中已经有多个项目会怎样呢?
【setTimeout】回调函数的处理将会等待,它得排在已有的事件之后——通常没有抢占式的方式支持将当前事件排在事件队列首部。这解释了为什么setTimeout()定时器的精度不高。它只会确保回调函数不会在指定的时间间隔之前执行,可能会在那个时刻执行,也可能在那之后执行,根据事件循环队列的状态而定。

    推荐阅读