精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

setTimeout的實現原理和使用注意

開發 前端
setTimeout,它就是一個定時器,用來指定某個函數在多少毫秒之后執行。

setTimeout,它就是一個定時器,用來指定某個函數在多少毫秒之后執行。

setTimeout用法 

  1. var timeoutID = setTimeout(function[, delay, arg1, arg2, ...]);  
  2. var timeoutID = setTimeout(function[, delay]);  
  3. var timeoutID = setTimeout(code[, delay]); 
  •     第一個參數為函數或可執行的字符串(比如alert('test'),此法不建議使用)
  •     第二個參數為延遲毫秒數,可選的,默認值為0.
  •     第三個及后面的參數為函數的入參。
  •     setTimeout 的返回值是一個數字,這個值為timeoutID,可以用于取消該定時器。

setTimeout在瀏覽器中的實現

瀏覽器渲染進程中所有運行在主線程上的任務都需要先添加到消息隊列,然后事件循環系統再按照順序執行消息隊列中的任務。 

在 Chrome 中除了正常使用的消息隊列之外,還有另外一個消息隊列(我們可以稱為延遲隊列),這個隊列中維護了需要延遲執行的任務列表,包括了定時器和 Chromium 內部一些需要延遲執行的任務。所以當通過 JavaScript 創建一個定時器時,渲染進程會將該定時器的回調任務添加到延遲隊列中。

比如這樣的一段代碼: 

  1. function foo(){  
  2.   console.log("test")  
  3.  
  4. var timeoutID = setTimeout(foo,100); 

當通過 JavaScript 調用 setTimeout 設置回調函數的時候,渲染進程將會創建一個回調任務,包含了回調函數foo、當前發起時間、延遲執行時間等,其模擬代碼如下所示: 

  1. struct DelayTask{  
  2.   int64 id;  
  3.   CallBackFunction cbf;  
  4.   int start_time;  
  5.   int delay_time;  
  6. };  
  7. DelayTask timerTask;  
  8. timerTask.cbf = foo 
  9. timerTask.start_time = getCurrentTime(); //獲取當前時間  
  10. timerTask.delay_time = 100;//設置延遲執行時間 

創建好回調任務之后,就會將該任務添加到延遲執行隊列中。那這個回調任務,什么時候會被執行呢?

瀏覽器中有個函數是專門用來處理延遲執行任務的,暫且稱為ProcessDelayTask,它的主要邏輯如下: 

  1. void ProcessTimerTask(){  
  2.   //從delayed_incoming_queue中取出已經到期的定時器任務  
  3.   //依次執行這些任務  
  4.  
  5. TaskQueue task_queue;  
  6. void ProcessTask();  
  7. bool keep_running = true 
  8. void MainTherad(){  
  9.   for(;;){  
  10.     //執行消息隊列中的任務  
  11.     Task task = task_queue.takeTask();  
  12.     ProcessTask(task);  
  13.     //執行延遲隊列中的任務  
  14.     ProcessDelayTask()  
  15.     if(!keep_running) //如果設置了退出標志,那么直接退出線程循環  
  16.         break;   
  17.   }  

其實就是,當瀏覽器處理完消息隊列中的一個任務之后,就會開始執行 ProcessDelayTask 函數。ProcessDelayTask 函數會根據發起時間和延遲時間計算出到期的任務,然后依次執行這些到期的任務。等到期的任務執行完成之后,再繼續下一個循環過程。這樣定時器就實現了,從這個過程也可以明顯看出,定時器并不一定是準時延后執行的。

注意事項

  1.  如果當前任務執行時間過久,會延遲到期定時器任務的執行

在使用 setTimeout 的時候,有很多因素會導致回調函數執行比設定的預期值要久,其中一個就是上文說到的,如果處理的當前任務耗時過長,定時器設置的任務就會被延后執行。

比如在瀏覽器中執行這樣一段代碼,并打印執行時間: 

  1. function bar() {  
  2.     console.log('bar')  
  3.     const endTime = Date.now()  
  4.     console.log('cost time',endTime - startTime)  
  5.  
  6. function foo() {  
  7.     setTimeout(bar, 0);  
  8.     for (let i = 0; i < 5000; i++) {  
  9.         let i = 5+8+8+8  
  10.         console.log(i)  
  11.     }  
  12.  
  13. foo() 

執行結果如圖:

從結果可以看到,執行 foo 函數所消耗的時長是 365 毫秒,這也就意味著通過 setTimeout 設置的任務被推遲了 365 毫秒才執行,而設置 setTimeout 的回調延遲時間是 0。

      2 .  使用 setTimeout 設置的回調函數中的 this 環境不是指向回調函數

比如這段代碼: 

  1. var name1 
  2. var MyObj = {  
  3.   name: 2,  
  4.   test:1,  
  5.   showName: function(){  
  6.     console.log(this.name,this.test);  
  7.   }  
  8.  
  9. setTimeout(MyObj.showName,1000)  
  10. MyObj.showName()  
  11. //先輸出 2 1  
  12. // 1s后輸出 1 undefined  

這里其實認真分析一下,也很好理解這個 this 的指向。按照 this 的規定,如果是對象調用(obj.fn()),那么this指向該對象,因此MyObj.showName()輸出的是 MyObj 里面的值。在 setTimeout 中,入參是MyObj.showName,這里是把這個值傳了進去,可以理解為: 

  1. const fn = MyObj.showName  
  2. setTimeout(fn,1000) 

這樣看,在setTimeout里面,當執行到的時候,實際上就是在window下執行fn,此時的this,就指向了window,而不是原來的函數。

      3 .  setTimeout 存在嵌套調用問題

如果 setTimeout 存在嵌套調用,調用超過5次后,系統會設置最短執行時間間隔為 4 毫秒。

我們可以在瀏覽器粗略測試一下,有如下代碼: 

  1. let startTime = Date.now()  
  2. function cb() {   
  3.   const endTime = Date.now()  
  4.   console.log('cost time',endTime - startTime)  
  5.   startTimestartTime = startTime  
  6.   setTimeout(cb, 0);   
  7.  
  8. setTimeout(cb, 0); 

執行結果:

從結果可以看出,前面五次調用的時間間隔比較小,嵌套調用超過五次以上,后面每次的調用最小時間間隔是 4 毫秒(我運行的結果,間隔基本是 5ms,考慮有代碼執行的計算誤差)。

之所以出現這樣的情況,是因為在 Chrome 中,定時器被嵌套調用 5 次以上,系統會判斷該函數方法被阻塞了,如果定時器的調用時間間隔小于 4 毫秒,那么瀏覽器會將每次調用的時間間隔設置為 4 毫秒。可以看下源碼(https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/frame/dom_timer.cc) 

  1. static const int kMaxTimerNestingLevel = 5 
  2. // Chromium uses a minimum timer interval of 4ms. We'd like to go  
  3. // lower; however, there are poorly coded websites out there which do  
  4. // create CPU-spinning loops.  Using 4ms prevents the CPU from  
  5. // spinning too busily and provides a balance between CPU spinning and  
  6. // the smallest possible interval timer.  
  7. static constexpr base::TimeDelta kMinimumInterval = base::TimeDelta::FromMilliseconds(4); 

所以,一些實時性較高的需求就不太適合使用 setTimeout 了,比如你用 setTimeout 來實現 JavaScript 動畫就不一定是一個很好的主意。

      4 .  未激活的頁面,setTimeout 執行最小間隔是 1000 毫秒

如果標簽不是當前的激活標簽,那么定時器最小的時間間隔是 1000 毫秒,目的是為了優化后臺頁面的加載損耗以及降低耗電量。這一點你在使用定時器的時候要注意。

      5 .   延時執行時間有最大值

Chrome、Safari、Firefox 都是以 32 個 bit 來存儲延時值的,32bit 最大只能存放的數字是 2147483647 毫秒,這就意味著,如果 setTimeout 設置的延遲值大于 2147483647 毫秒(大約 24.8 天)時就會溢出,這導致定時器會被立即執行。如: 

  1. let startTime = Date.now()  
  2. function foo(){  
  3.   const endTime = Date.now()  
  4.   console.log('cost time',endTime - startTime)  
  5.   console.log("test")  
  6.  
  7. var timerID = setTimeout(foo,2147483648);//會被立即調用執行 

執行結果:

運行后可以看到,這段代碼是立即被執行的。但如果將延時值修改為小于 2147483647 毫秒的某個值,那么執行時就沒有問題了。 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2012-01-12 12:08:02

Java

2022-10-24 00:48:58

Go語言errgroup

2022-06-21 14:02:29

MongoDB數據庫存儲

2024-02-01 09:39:02

asyncawaitPromise

2022-03-17 08:55:43

本地線程變量共享全局變量

2022-05-06 09:22:25

Go泛型

2023-03-29 10:19:44

異步編程AsyncPromise

2021-02-19 08:20:42

JWT網絡原理

2022-07-05 09:44:25

服務治理熔斷限流

2020-11-13 07:11:23

MySQL復制日志

2014-12-23 13:50:46

多播組播

2025-07-25 10:22:12

2024-10-16 08:36:03

2021-04-21 09:28:17

字節面試官SetTimeout

2020-03-27 22:18:55

JavaScript編程語言代碼

2024-06-27 08:26:10

LooperAndroid內存

2020-09-28 15:00:19

Linux容器虛擬化

2011-05-31 14:33:53

settimeout

2025-05-19 00:02:45

SQL窗口函數

2024-01-19 12:48:00

Redis存儲數據庫
點贊
收藏

51CTO技術棧公眾號

日本不卡的三区四区五区| 欧美绝顶高潮抽搐喷水合集| 国产精品色一区二区三区| 国产日韩在线一区| 爱爱视频免费在线观看| 99ri日韩精品视频| 91久久精品国产91性色tv | 国产精品久久久久久久一区二区| 在线精品国产| 国产丝袜视频一区| 中文字幕第一页在线视频| 人人草在线视频| 日韩久久一区二区| 欧美激情www| 99热这里只有精品99| 视频一区中文字幕国产| 欧美日韩国产成人在线观看| 成人午夜剧场视频网站| 亚洲午夜免费| 在线成人小视频| 久久久噜噜噜www成人网| caoporn免费在线| 国产亚洲成av人在线观看导航 | 一区二区三区日韩精品视频| 欧美在线3区| 亚洲欧美激情另类| 激情文学综合插| 日本一区二区三区四区视频| 久久精品一级片| 成人在线免费小视频| 亚洲第一偷拍网| 国内精品国产三级国产aⅴ久| av网站中文字幕| 亚洲电影在线一区二区三区| 亚洲天堂男人天堂女人天堂| 中文字幕天堂网| 日本少妇精品亚洲第一区| 欧美亚洲日本一区| 成年人视频网站免费观看| 国产99re66在线视频| 日韩理论片在线| 中文网丁香综合网| 国产高清视频在线| 久久久一区二区| 麻豆精品蜜桃一区二区三区| 少妇一区二区三区四区| 亚洲狠狠婷婷| 欧美精品在线观看| 国产精品视频一区二区在线观看| 精品日产免费二区日产免费二区| 亚洲日本中文字幕| 人妻大战黑人白浆狂泄| 人体久久天天| 亚洲欧美福利视频| 97伦伦午夜电影理伦片| 最新国产一区| 亚洲人成网在线播放| 中文字幕在线1| 精品国产精品| 丝袜情趣国产精品| 欧美一级特黄高清视频| 91精品啪在线观看国产18| 精品国产一区二区三区久久久 | 日韩精品xxx| 精品一区二区三区免费看| 制服丝袜激情欧洲亚洲| 九九热视频免费| 涩涩屋成人免费视频软件| 日韩午夜av电影| 稀缺小u女呦精品呦| 激情亚洲另类图片区小说区| 国产视频久久久久| 亚洲人成人无码网www国产| 精品99在线| 久久精品男人天堂| 国产在线观看免费视频今夜| 精品99视频| 欧美重口另类videos人妖| 无码人妻丰满熟妇区bbbbxxxx| 日韩不卡一区二区| 成人xvideos免费视频| 国产裸体无遮挡| 成人免费av网站| 欧美一区二区三区四区夜夜大片| 9191在线| 亚洲一区二区免费视频| 一本大道熟女人妻中文字幕在线| а√天堂资源国产精品| 欧美一区二区福利在线| 亚洲av成人精品一区二区三区| 亚洲三级精品| 久久精品国产久精国产思思| 中文在线观看免费网站| 日本强好片久久久久久aaa| 亚洲在线免费观看| 麻豆影视在线| 亚洲激情自拍视频| 欧美日韩在线不卡视频| 国产日韩中文在线中文字幕| 日韩成人av网址| 综合 欧美 亚洲日本| 亚洲国产三级| 亚洲a中文字幕| 男人的天堂在线免费视频| 尤物av一区二区| 激情五月亚洲色图| 成人中文字幕视频| 色婷婷久久一区二区| 日本a在线观看| 一区二区三区国产盗摄| 国产精品视频在线播放| 欧美熟妇交换久久久久久分类 | 精品久久久无码人妻字幂| 成人在线爆射| 日韩成人高清在线| 久久久久噜噜噜亚洲熟女综合| 日本在线不卡一区| 国内精品视频免费| 伦理在线一区| 56国语精品自产拍在线观看| 国产三级av在线播放| 亚洲日本黄色| 成人黄色片视频网站| 女女色综合影院| 欧美性大战久久久久久久蜜臀| 99re久久精品国产| 亚洲黄色影片| 不卡视频一区二区三区| 国产美女av在线| 欧美日韩视频专区在线播放| 精品无码一区二区三区| 9色精品在线| 精品久久sese| 成年人黄色大片在线| 日韩女同互慰一区二区| 国产美女久久久久久| 免费高清不卡av| 日韩欧美一区二区三区四区五区 | 91啦中文在线| 在线视频国内一区二区| a级大片在线观看| 国产农村妇女精品一二区| 国产一级精品aaaaa看| xxxx在线视频| 亚洲成人亚洲激情| 男人天堂中文字幕| 99久久精品国产一区二区三区| 精品国偷自产一区二区三区| 成人盗摄视频| 97在线观看视频国产| 天堂av2024| 欧美日韩视频免费播放| 无码人妻精品一区二区三区温州| 国产精品美女久久久| 久久综合一区| 成人mm视频在线观看| 亚洲一区二区久久久| 亚洲精品国产欧美在线观看| 国产午夜亚洲精品理论片色戒 | 伊人久久五月天| 一区二区视频免费| 亚洲人成网站精品片在线观看 | 亚洲一区二区人妻| 中文字幕一区免费在线观看| 日韩欧美理论片| 国内在线观看一区二区三区| 精品综合久久久| 日韩欧美少妇| 久久亚洲国产精品| 亚洲乱色熟女一区二区三区| 亚洲成a人在线观看| 日本黄色特级片| 男女性色大片免费观看一区二区| 中文字幕99| 成人av综合网| 国产精品va在线| 亚洲资源一区| 国产丝袜一区二区三区免费视频| 亚洲欧美一二三区| 亚洲国产精品高清| 久久av一区二区三| 最近中文在线观看| 激情婷婷久久| 国产自产精品| 日韩国产网站| 久久成人免费视频| 天堂网av在线播放| 欧美艳星brazzers| 99精品久久久久| 26uuu色噜噜精品一区二区| 欧美成人免费高清视频| 四季av一区二区凹凸精品| av资源站久久亚洲| 奇米777日韩| 欧美成人在线影院| 欧美性孕妇孕交| 91精品中文字幕一区二区三区| 国产亚洲第一页| 国产亚洲婷婷免费| 中文字幕人妻熟女人妻a片| 久久国产精品毛片| 免费cad大片在线观看| 国产99久久久国产精品成人免费| 成人h视频在线观看播放| 国产传媒在线观看| 久久久国产一区二区| 九色国产在线观看| 精品日韩99亚洲| 中文字幕av影视| 精品久久中文字幕久久av| 一区二区三区四区五区| 久久精品人人做人人爽人人| 第一页在线视频| 免费成人在线网站| 精品人妻一区二区三区四区在线| 99九九热只有国产精品| 欧美精品七区| 国产精品qvod| 97免费资源站| 亚洲伊人精品酒店| 国产精品88a∨| 手机av在线| 欧美激情国产高清| av观看在线| 日韩在线视频播放| 3d成人动漫在线| 亚洲色图综合久久| 香蕉视频黄在线观看| 精品久久久久99| 99精品在线视频观看| 欧美丝袜丝交足nylons| 久久久久久不卡| 黑人极品videos精品欧美裸| 久久久久久久蜜桃| 亚洲精品第1页| 中文字幕亚洲欧美日韩| 中文字幕中文在线不卡住| 成人免费无遮挡无码黄漫视频| 91在线观看视频| 国产精品一级黄片| av电影在线观看不卡| 无码国产精品一区二区免费式直播 | 在线免费观看高清视频| 在线看国产一区| 日韩免费av网站| 欧美综合色免费| 探花国产精品一区二区| 色一区在线观看| 少妇久久久久久久| 欧美性色黄大片| 在线播放国产一区| 在线成人午夜影院| 精品人妻一区二区三区麻豆91 | 国产精品夜间视频香蕉| 巨胸喷奶水www久久久免费动漫| 国产精品吹潮在线观看| 最新日韩一区| 92福利视频午夜1000合集在线观看| 日本成人一区二区| 亚洲一区二区三区久久 | 亚洲欧美激情精品一区二区| 欧美午夜黄色| 在线精品播放av| 老司机在线看片网av| 欧美裸体男粗大视频在线观看| 国产在线xxx| 日本精品久久久| 国产一区二区三区朝在线观看| 国产精品丝袜视频| 国产亚洲高清一区| 精品国产一区二区三区麻豆免费观看完整版 | 午夜在线观看免费一区| 九一精品在线观看| 狠狠色综合色综合网络| www.17c.com喷水少妇| 2023国产一二三区日本精品2022| 免费人成又黄又爽又色| 亚洲欧美精品午睡沙发| 青青草av在线播放| 在线观看成人小视频| 国产成人久久精品77777综合 | 亚洲欧美日本日韩| 艹b视频在线观看| 高清不卡一区二区| 黄免费在线观看| 一区二区三区中文字幕在线观看| 国产情侣在线视频| 欧美视频完全免费看| 亚洲乱码国产乱码精品精软件| 亚洲一区二区久久久| 青青在线视频| 国产精品久久久久久av| 福利欧美精品在线| 欧美日韩综合精品| 正在播放日韩欧美一页| 国产午夜伦鲁鲁| 国产麻豆9l精品三级站| 中文字幕被公侵犯的漂亮人妻| 一区二区三区av电影| 337p粉嫩色噜噜噜大肥臀| 日韩欧美一区二区在线视频| 国产一级免费在线观看| 欧美激情精品久久久久久蜜臀 | 欧美日本在线播放| 天天操天天操天天操| 久久精品视频在线播放| 亚洲综合电影| 国产69精品久久久久9999apgf| 久久综合国产| 久久久久狠狠高潮亚洲精品| 国产精品白丝av| 欧美自拍偷拍网| 欧美视频中文字幕在线| 99热这里精品| 日韩中文字幕精品| 另类专区亚洲| 精品麻豆av| 一区二区亚洲| 特级黄色片视频| 国产精品乱码妇女bbbb| 久久夜色精品国产噜噜亚洲av| 亚洲精品一区二区三区99| 黄色在线视频网站| 国产精品日韩在线播放| 亚洲精品一级二级三级| 成人黄色av片| 成人福利在线看| 国产亚洲欧美精品久久久久久| 欧美日韩国产综合视频在线观看| 日本黄在线观看| 97视频com| 极品尤物一区| 欧美日韩成人免费视频| 成人午夜激情影院| 免费在线黄色片| 欧美第一区第二区| 色婷婷在线播放| av观看久久| 欧美三区美女| 精品久久久久久无码人妻| 亚洲黄色录像片| 性生交生活影碟片| 欧美精品久久久久久久久久| 日本少妇精品亚洲第一区| 国产亚洲精品久久久久久久| 高清av一区二区| 男女视频免费看| 亚洲欧美国产视频| 成人黄色视屏网站| 一区二区三区av在线| 精品一区二区成人精品| 黄色a级片在线观看| 欧美一级免费大片| 大香伊人久久| 欧美日韩亚洲一区二区三区在线观看 | 亚洲国产欧美日韩另类综合| 黄色av网站免费在线观看| 98精品国产自产在线观看| 亚洲+变态+欧美+另类+精品| 亚洲中文字幕无码不卡电影| 久久久精品2019中文字幕之3| 久草视频在线免费| 久久精品99久久久香蕉| 日本少妇精品亚洲第一区| 分分操这里只有精品| 91免费小视频| 中文字幕在线播放av| 欧美另类第一页| 日本中文字幕在线一区| 免费观看成人在线视频| 日韩一区欧美一区| 性做久久久久久久| 欧美在线视频免费| 成人aaaa| 无码人妻丰满熟妇区毛片蜜桃精品 | 99精品女人在线观看免费视频| 国产一级大片免费看| 久久免费电影网| 国产理论视频在线观看| 91精品国产色综合| 日韩av久操| 中文字幕在线国产| 欧美中文字幕亚洲一区二区va在线 | 亚洲黄色小说网| 国产精品video| 黄色成人av网站| 日本少妇xxxxx| 日韩你懂的在线播放| 国产日韩另类视频一区| 亚洲天堂第一区| 国产日韩精品一区二区三区| av网站免费播放| 国产成人久久久| 欧美日韩91| 人成免费在线视频| 亚洲第一中文字幕| 欧美91在线|欧美| www.浪潮av.com| 亚洲一区二区精品3399| 福利视频在线播放|