js是單線程執行的,在頁面下載完成後,代碼運行、事件處理程序,包括ajax都是在同樣的線程中執行。瀏覽器負責排序某段代碼在某個時間點運行。在頁面的生命週期中,不同時間可能會有其他代碼在控制js進程,定時器代碼也在其中。
定時器是計劃代碼在未來的某個時間執行,並不是單獨的線程。而定時器執行的時機是不能保證的。
**定時器隊列的工作方式:**當特定的時間過後將代碼插入。但並不意味着代碼會立即執行,只能是儘快執行。設定300ms後執行的定時器不代表到了300ms就一定會執行,因爲隊列中可能還會有其他代碼正在執行。只有當其他的代碼執行完後,定時器中的代碼纔會執行。
**tips:**定時器指定的時間間隔表示何時將定時器的代碼添加到隊列,而不是何時執行代碼。
####重複的定時器
重複的定時器setInterval()的重複規則存在兩個問題:1.某些間隔會跳過。當執定時器中代碼的時間比間隔時間更長時;2.多個定時器的代碼執行之間的間隔可能會比預期小。
代碼:
setTimeout(function() {
var div = document.getElementById("myDiv"),
left = parseInt(div.style.left) + 5;
div.style.left = left + "px";
if(left < 200) {
setTimeout(arguments.callee, 500);
}
}, 50);
這段代碼可以控制元素的動畫,”myDiv"元素每隔一定時間向右移動,在在左座標200像素的時候停止。
代碼分析:每次執行函數的時候都會創建一個新的定時器。
####代碼執行隊列
每個瀏覽器窗口、標籤頁、或者frame都有各自的代碼執行隊列。