浏览器的时钟精度就是浏览器更新时钟的频率。更新的越频繁,那么时间也就越准确。windows
如今浏览器的最小精度为4ms,但并不意味着频率时刻保持在4ms。仔细分析一下,“更新操做”对电脑来讲是比较烧脑的,脑子稍微差点的cpu反应慢,精度就低。事实上,除了cpu硬件以外,操做系统(OSX和windows下不一样)以及浏览器内核都会影响到浏览器的精度;其次,电脑自己的调节机制,尤为是笔记本。笔记本在使用电池供电的时候,精度就会被自动下降从而达到保护电源的做用。因此最小精度4ms只是当今浏览器的最高水平,显示状况下是不会达到这一精度。浏览器
在人类的眼中或许感受不到setTimeout()和setInterval()存在偏差,毕竟ms级的时间过短暂了。但事实上确实存在着偏差。下面来说偏差从何而来。函数
setTimeout(fn,15ms);
咱们先设置了这样一个延时处理的函数,fn函数
被添加到队列当中,预计15ms
以后执行。
过去的浏览器时间精度在10ms~15.6ms之间已是极限了,那么咱们就假设咱们使用的浏览器的时间精度为10ms。操作系统
函数等待时间 |--------------| 15ms 浏览器刷新 |--------||----------| 20ms
当第一个10ms以后,浏览器刷新了时间,发现“我靠,跑了这么久,尚未到点”,因而又发动第二次刷新。第二次刷新结束以后,20ms已通过去了,函数才到了执行期,而且比预期要多等了5ms。线程
咱们知道,浏览器执行js和更新界面是共用一个线程的,当线程空闲时,它会从任务队列中取任务来运行。因此当函数到了执行期时,它会被添加到队列当中,可是不必定当即执行,若是队列中还有其余任务,单线程的规则就会致使这个函数须要等待前面的任务执行完才能够执行。code
基于这两点缘由,setTimeout()和setInteval()在微世界中,其实并不守时,这是没法控制且无奈的事情。队列
从上面能够看出,浏览器的精度越小,那么偏差也就越小。嗯 ~ ~ 排队时间没法预算,只能求老天保佑了。硬件