3 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個贊
它不應(yīng)該特別準(zhǔn)確。有許多因素限制瀏覽器執(zhí)行代碼的時(shí)間; MDN引用:
除了“鉗制”之外,當(dāng)頁面(或OS /瀏覽器本身)忙于其他任務(wù)時(shí),超時(shí)也可能在以后觸發(fā)。
換句話說,setTimeout通常實(shí)現(xiàn)的方式,只是意味著在給定的延遲之后執(zhí)行,并且一旦瀏覽器的線程可以自由執(zhí)行它。
但是,不同的瀏覽器可能以不同的方式實(shí)現(xiàn)它。以下是我做過的一些測試:
var date = new Date();
setTimeout(function(e) {
var currentDate = new Date();
console.log(currentDate-date);
}, 1000);
// Browser Test1 Test2 Test3 Test4
// Chrome 998 1014 998 998
// Firefox 1000 1001 1047 1000
// IE 11 1006 1013 1007 1005
也許Chrome的<1000次可歸因于該Date類型的不準(zhǔn)確性,或者可能是Chrome使用不同的策略來決定何時(shí)執(zhí)行代碼 - 也許它試圖將其裝入最近的時(shí)段,即使超時(shí)延遲尚未完成。
簡而言之,setTimeout如果您期望可靠,一致,毫秒級的時(shí)序,則不應(yīng)使用。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個贊
通常,當(dāng)嘗試執(zhí)行精度高于50 ms的事物時(shí),計(jì)算機(jī)程序非常不可靠。這樣做的原因是即使在octacore超線程處理器上,操作系統(tǒng)通常也會處理數(shù)百個進(jìn)程和線程,有時(shí)甚至是數(shù)千個或更多。操作系統(tǒng)通過調(diào)度所有這些來實(shí)現(xiàn)所有多任務(wù)工作,以便一個接一個地獲得一片CPU時(shí)間,這意味著他們最多只需要幾毫秒的時(shí)間來做他們的事情。
這意味著,如果你設(shè)置一個1000毫秒的超時(shí),那么當(dāng)前的瀏覽器進(jìn)程甚至不會在那個時(shí)間點(diǎn)運(yùn)行的可能性很小,所以瀏覽器在1005,1010或之前沒有注意到這是完全正常的。甚至1050毫秒它應(yīng)該執(zhí)行給定的回調(diào)。
通常這不是問題,它發(fā)生了,并且它很少是最重要的。如果是,所有的操作系統(tǒng)供應(yīng)內(nèi)核級的定時(shí)器,遠(yuǎn)遠(yuǎn)更超過1毫秒精確,并允許開發(fā)人員在執(zhí)行代碼正是在正確的時(shí)間點(diǎn)。但是,作為一個沙盒很大的環(huán)境,JavaScript無法訪問這樣的內(nèi)核對象,并且瀏覽器不會使用它們,因?yàn)樗碚撋峡梢宰屇橙藦木W(wǎng)頁內(nèi)部攻擊操作系統(tǒng)穩(wěn)定性,通過仔細(xì)構(gòu)建使其他人挨餓的代碼線程淹沒了許多危險(xiǎn)的計(jì)時(shí)器。
至于為什么測試產(chǎn)生980我不確定 - 這將取決于你正在使用哪個瀏覽器以及哪個JavaScript引擎。然而,我可以完全理解瀏覽器是否只是手動向下校正系統(tǒng)負(fù)載和/或速度,確?!捌骄舆t仍然是正確的時(shí)間” - 從沙盒原理到僅僅是很有意義接近所需的時(shí)間而不會給系統(tǒng)的其他部分帶來負(fù)擔(dān)。

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個贊
如果我誤解了這些信息,請有人糾正我:
根據(jù)John Resig的帖子,關(guān)于跨平臺的性能測試的不準(zhǔn)確性(強(qiáng)調(diào)我的)
隨著系統(tǒng)時(shí)間不斷向下舍入到最后查詢時(shí)間(每個間隔約15毫秒),性能結(jié)果的質(zhì)量嚴(yán)重受損。
因此,與系統(tǒng)時(shí)間相比,兩端最多可以有15毫秒的軟糖。
添加回答
舉報(bào)