瀏覽器的時鐘精度就是瀏覽器更新時鐘的頻率。更新的越頻繁,那麼時間也就越準確。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()在微世界中,其實並不守時,這是沒法控制且無奈的事情。隊列
從上面能夠看出,瀏覽器的精度越小,那麼偏差也就越小。嗯 ~ ~ 排隊時間沒法預算,只能求老天保佑了。硬件