深入:定時器原理

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都有各自的代碼執行隊列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章