JavaScript定時器 setTimeout與setInterval 淺析
阿新 • • 發佈:2017-11-13
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 淺析