這裏是一個page you can run,它會告訴你在您的系統上的瀏覽器中setTimeout()
的變化是什麼。它運行10000 setTimeout(fn, 1)
操作並記錄調用之間的平均,最大和最小延遲並將其輸出到屏幕。
setTimeout()
確實有一個最低值,它會尊重。它通過瀏覽器有所不同,但它通常在10-20毫秒範圍內(儘管它可以更小或更大 - 取決於瀏覽器)。這被稱爲「夾緊」。它的目的是保護瀏覽器事件隊列免受太多的JavaScript執行,並沒有足夠的時間去做其他事情(如服務其他用戶事件,重繪等)。
但是,這隻意味着瀏覽器不會比最小值更早觸發一個,並不意味着您將永遠快速獲得一個。 Javascript是單線程的,所以如果瀏覽器很忙,setTimeout()
將不會發生,直到沒有更多的JavaScript執行,並且下一個計時器事件到達隊列的前端。
此外,當具有計時器的頁面不是當前選項卡時,計時器將在一些現代瀏覽器中變慢。你可以看到,在上面的頁面切換到另一個標籤時,它正在運行,並看到你得到一個較慢的平均時間。
對於那些好奇,這裏是從該網頁的代碼:
var lastTime = new Date();
var cumDiff = 0;
var minDelta = 1000000;
var maxDelta = 0;
var cnt = 0;
var nowElem = document.getElementById("now");
var deltaElem = document.getElementById("delta");
var minDeltaElem = document.getElementById("minDelta");
var maxDeltaElem = document.getElementById("maxDelta");
function run() {
var now = new Date().getTime();
var diff = now - lastTime;
cumDiff += diff;
minDelta = Math.min(diff, minDelta);
maxDelta = Math.max(diff, maxDelta);
cnt++;
var avgDelta = cumDiff/cnt;
lastTime = now;
nowElem.innerHTML = now;
deltaElem.innerHTML = avgDelta.toFixed(1);
minDeltaElem.innerHTML = minDelta;
maxDeltaElem.innerHTML = maxDelta;
if (cnt < 10000) {
setTimeout(run, 1);
}
}
setTimeout(run, 1);
免責聲明:某些舊的瀏覽器沒有很準確Date()
功能(只精確到10-20ms內),所以這個數據韓元在其中一個較舊的瀏覽器中,它不會非常準確。
是什麼讓你覺得這不?你的例子沒有證明任何東西。 – j08691 2012-01-17 03:15:42
因爲不管我是放999還是1,它都會以完全相同的速率發射... 1秒。這是一個簡化的例子,我真正的代碼使用這個函數來遞減倒數計時器。如果我把它包括在內,會更有幫助嗎? – zakdances 2012-01-17 03:21:00