定時器引發的思考
個人部落格上線歡迎來訪 http://www.zihanzy.com
定時器真的是定時執行的嗎?
定時器並不能保證真正定時執行,一般會延遲一點,但是也有可能延遲很長時間
如下例
document.querySelector('button').onclick = function(){
var start = Date.now()
console.log('啟動定時器前')
setTimeout(function(){
console.log('定時器執行了',Date.now()-start)
},200)
console.log('啟動定時器後...')
}
可以看到定時器並不一定按照我們設定的時間去執行,而是有一定的延遲,不過這個延遲我們還能接受
上面說到定時器也可能延遲很長時間
document.querySelector('button').onclick = function(){
var start = Date.now()
console.log('啟動定時器前')
setTimeout(function(){
console.log('定時器執行了',Date.now()-start)
},200)
console.log('啟動定時器後...')
//做一個時間的工作
for(var i = 0;i<1000000000;i++){
}
}
為什麼?
首先定時器的回撥函式是在主執行緒執行的,所有的js程式碼都是在主程式執行。
之所以延遲執行是因為for
它的執行機制是先執行初始化程式碼(也包含設定定時器、繫結監聽、傳送ajax)在執行回撥程式碼,因此要等初始化程式碼執行完畢後在設定定時器,所以看到上面的延遲 問題。
事件佇列與事件輪詢
瀏覽器執行先執行初始化程式碼,當發現有定時器,事件監聽時,將函式進行繫結並儲存到回撥佇列裡面,此時還沒有執行。當初始化程式碼執行完畢後從任務佇列中迴圈取出回撥函式放入執行棧中進行處理(一個接一個)
個人部落格上線歡迎來訪 http://www.zihanzy.com
相關文章
- JS學習筆記之由定時器引發的深入思考JS筆記定時器
- 一次定時任務配置錯誤引發的思考
- for...in引發的思考
- 一個延時任務問題引發的思考
- 電梯引發的思考
- 一個commit引發的思考MIT
- Javascript 定時器呼叫傳遞引數的方法JavaScript定時器
- 從app.route裝飾器引發對endpoint的思考APP
- 部門老大的發言引發的思考
- 由一個emoji引發的思考
- 由《暗黑地牢》這款「地主模擬器」引發的思考
- 首頁白屏的引發的思考(一)
- 關於vue3簡單狀態管理約定引發的思考Vue
- 一道題引發的EventLoop思考OOP
- 從跨域引發的Web安全思考?跨域Web
- 佇列順序性引發的思考佇列
- 一次Toast元件引發的思考AST元件
- 一條Python命令引發的漏洞思考Python
- 造後臺輪子引發的思考
- 一道排序題引發的思考排序
- 由mv命令引發的對inode的思考
- 【高併發】由InterruptedException異常引發的思考Exception
- 定時器以及定時器的幾個案例定時器
- flask_login模組中user_loader裝飾器引發的思考Flask
- 伺服器時間同步引發的"慘案"伺服器
- 一道面試題引發的思考面試題
- 堆疊溢位報錯引發的思考
- 交換2個整形數引發的思考
- 由屎色自行車棚引發的思考
- 由Siri和Alexa結婚引發的思考
- 記一個面試題引發的思考面試題
- 從函式式元件引發的效能思考函式元件
- iOS開發基礎149-由UUIDString引發的思考iOSUI
- 由 LG P4309 引發的擴充思考
- 一次composer錯誤使用引發的思考
- Node-Sass安裝失敗引發的思考
- 測試雜談——一條SQL引發的思考SQL
- MES引發資訊部門的價值思考