1. 程式人生 > >JavaScript定時器 setTimeout與setInterval 淺析

JavaScript定時器 setTimeout與setInterval 淺析

throttle tin 並不是 tint 導致 語句 運行 應用 超過

一、 前情提要

  1)JavaScript 是運行在單線程的執行環境中的

  2)由瀏覽器安排事件的執行順序

二、setTimeout

  使用場景: 設定代碼在未來的某個時間執行,而執行的時機是不能保證的。

  工作方式: 在特定的時間過去之後將時間插入執行隊列,註意,並不是立即執行

三、重復的定時器 setInterval

  使用場景: 在設定的時間段內在代碼執行隊列中插入一段待執行代碼

  註意: 當有定時器中的代碼正在執行時,會跳過這次插入

  缺點:即使跳過了某些間隔代碼的執行,在定時器代碼執行時間比設定的時間長時,依然會出現代碼執行的間隔比預期的小

  解決方法: 鏈式調用setTimeout來代替setInterval

setTimeout(function() {
        //處理...
        setTimeout(argument.callee, time)
    }
}, time)

四、 應用場景舉例

  1)JavaScript在瀏覽器運行中都分配了一個確定數量的資源,代碼超過特定時間或特定語句之後就不會執行,如果代碼不是同步的,並且可以不立即執行,可以用定時器加數組分塊的方法來分塊執行,解決上述限制帶來的問題

  2)節流: 一些js語句是消耗非常大的,例如DOM操作,當這樣的語句過多時就會導致瀏覽器崩潰,為了解決上述問題,可以采用setTimeout對該函數進行節流,即規定這些開銷比較大的代碼不可以在沒有間斷的情況下連續執行

以窗口大小改變時的節流為例:

function throttle (method, context) {//當第二個函數為空時,就在全局作用域執行該方法
   clearTimeout(method.tid) ;
   method.id = setTimeout (function() {
      method.call(context)
  }, 100)
}

function resizeProcess = function () {
  //窗口大小改變時真正要執行的代碼  
}

window.resize = function () {
   throttle (resizeProcess ) 
}

  

歡迎交流指正!   

  

JavaScript定時器 setTimeout與setInterval 淺析