先说结论:不能。
为什么不能?这个问题可以从以下方面来阐述:硬件、系统、标准和事件循环。
- 硬件。
- 这个世界上是否存在真正的精确计时?绝对意义上的精确当然是不存在的,相对意义上的精确是存在的,即原子钟,它是利用原子的共振频率来完成计时的(目前最精确的计时方式)。计算机里的计时利用的是CPU的寄存器,而非原子钟,所以从硬件层面就达不到精确的计时。硬件达不到,运行在硬件上的系统、软件都达不到。
- 系统。
- JS是最终是交给浏览器,而浏览器本身是不会去计时的,它调用的是操作系统的计时接口,它会根据不同的操作系统来进行不同的调用,比如Mac和Window的计时实现在操作系统层面的实现它就不一样。
- 标准
- W3C标准。如果setTimeout的嵌套超过了四层,也就是>=5层的时候,它的计时最小是4毫秒,即使你把计时间隔设置为0也是4ms。
- 语言层面标准是ES标准。
- 事件循环
- 哪怕时间到了该执行了,它就一定执行嘛? 不一定。由于受事件循环的影响,它的回调函数必须等待执行栈的清空,执行栈不清空它的回调函数运行不了,哪怕时间已经到了。