精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

99精品视频网站| 国产欧美一区二区三区在线看 | 亚洲网址你懂得| 亚洲午夜精品一区| 91豆花视频在线播放| 久久久久久久久久看片| 国产欧美日韩丝袜精品一区| 久久精品国产亚洲av香蕉| 国产精品免费不| 日韩欧美在线影院| 999精品网站| 在线你懂的视频| 久久精品夜色噜噜亚洲aⅴ| 91亚洲va在线va天堂va国| 日韩av男人天堂| 日韩在线理论| 亚洲精品自在久久| 国产男女无遮挡猛进猛出| 中文在线8资源库| 亚洲最色的网站| 亚洲精品成人久久久998| 懂色av蜜臀av粉嫩av分享吧| 久久成人免费网站| 欧洲精品毛片网站| 久久国产精品二区| 久久精品国产大片免费观看| 日韩国产欧美精品一区二区三区| av在线网址导航| 欧美××××黑人××性爽| 亚洲国产日韩一区二区| 亚洲啪啪av| 黄色美女网站在线观看| 99久久精品国产一区二区三区| 国产精品视频久久久| 九九热在线视频播放| 国产一区二区三区四区老人| 日韩在线视频一区| 欧美人妻一区二区三区| 四虎5151久久欧美毛片| 日韩精品一区在线观看| 欧美视频国产视频| 国产精品成人国产| 色www精品视频在线观看| 黄色一级在线视频| 国产精品—色呦呦| 亚洲黄色小视频| 在线视频亚洲自拍| 一级毛片视频在线观看| 欧美激情一区三区| 欧美一区二区高清在线观看| 五月婷婷伊人网| 波多野结衣亚洲一区| 成人av中文| 亚洲AV无码精品色毛片浪潮| 国产传媒久久文化传媒| 91中文精品字幕在线视频| 91禁在线观看| 精品一区二区三区免费毛片爱| 国产精品欧美亚洲777777| 日批视频免费观看| 麻豆精品国产91久久久久久| 国产精品一区二区电影| 中文字幕一二区| 蜜臀久久99精品久久久画质超高清 | 7777精品久久久大香线蕉| mm131国产精品| gogo大尺度成人免费视频| 91精品国产综合久久精品app| www.日本久久| 国产精品一区二区中文字幕| 日韩成人中文字幕| 色一情一交一乱一区二区三区| 国产成人手机高清在线观看网站| 中文字幕一区电影| 国产黄在线免费观看| 国产精品av久久久久久麻豆网| 久久久久久国产精品美女| 欧美一级视频免费观看| 丝袜a∨在线一区二区三区不卡| 国产精品第一区| 国产精品国产av| 国产福利一区在线观看| 九色91国产| 在线观看免费网站黄| 一区二区三区自拍| 97在线播放视频| 韩国成人在线| 日韩免费视频线观看| 中文字幕在线观看的网站| 精品国产中文字幕第一页| 欧美成人手机在线| 欧美精品韩国精品| 国产一区在线观看视频| 久久精品一二三区| 日本高清视频在线观看| 亚洲一区二区免费视频| 9久久婷婷国产综合精品性色 | 鲁片一区二区三区| 免费av在线网址| 偷拍与自拍一区| 久久黄色片网站| 婷婷综合成人| 欧美理论电影在线播放| 无码人妻丰满熟妇区bbbbxxxx| 国内精品伊人久久久久影院对白| 韩国成人一区| 日本少妇激情视频| 久久中文在线| 91精品天堂| 毛片在线播放网站| 亚洲欧美激情小说另类| 97在线免费公开视频| 榴莲视频成人app| 亚洲视频免费一区| 久青草免费视频| 久久精品国产精品亚洲综合| 久久精品日产第一区二区三区| 黄av在线播放| 91黄色免费观看| 人妻体内射精一区二区三区| 99久久夜色精品国产亚洲1000部| 9.1国产丝袜在线观看| 国产又黄又粗又硬| 日本一区二区三区视频视频| 无罩大乳的熟妇正在播放| 精品视频一区二区三区| 中文字幕精品一区二区精品| 亚洲午夜18毛片在线看| 成人黄色一级视频| 久久香蕉视频网站| 亚州精品国产| 中文字幕久久亚洲| 无码人妻丰满熟妇精品区| 99精品热视频| 97免费视频观看| 日韩视频一二区| 久久精品国产免费观看| 中文字幕在线2019| 日本一区二区三区视频视频| 91蝌蚪视频在线观看| 美女久久久久| 日韩av理论片| 黄色小视频在线免费观看| 日韩欧美精品在线观看| 精品无码在线视频| 99综合在线| 久久99精品久久久久久水蜜桃| 岛国av在线网站| 亚洲精品按摩视频| 日韩污视频在线观看| 不卡免费追剧大全电视剧网站| 国产成人在线小视频| 99精品在免费线中文字幕网站一区| 久热精品视频在线观看一区| 国产农村妇女毛片精品| 亚洲视频小说图片| 欧美一区二区三区影院| 国产精品va| 国产免费高清一区| 精精国产xxxx视频在线播放| 日韩电影网在线| 国产一级片av| 国产精品国产三级国产普通话三级 | 99久久精品免费看国产四区| 人人超在线公开视频| 精品国产一区二区三区忘忧草| 国产一级做a爰片在线看免费| jizz一区二区| 久草在在线视频| 国产精品97| 99久久无色码| 亚洲性色av| 中文字幕久久亚洲| www.四虎在线观看| 精品国产电影一区| 国产精品高清无码在线观看| 久久国产日韩欧美精品| 成人在线免费观看视频网站| 色综合久久中文| 国产男人精品视频| 日本在线观看高清完整版| 亚洲激情视频在线| 中文字幕在线2018| 亚洲成人av免费| 免费黄在线观看| 国产成人在线视频播放| 国产资源在线视频| 日韩精品一卡| 国产手机精品在线| 草莓视频成人appios| 欧美大片在线免费观看| 青青操在线视频| 欧美一区二区三区喷汁尤物| 黄色大片网站在线观看| 1024成人网| 日韩网站在线播放| 国产精品亚洲专一区二区三区| 黄瓜视频免费观看在线观看www | 欧美成人家庭影院| 久久久久久久香蕉网| 福利成人在线观看| 亚洲成人精品在线| 亚洲在线视频播放| 精品av在线播放| 99视频只有精品| 久久久不卡影院| 人妻互换一二三区激情视频| 日本女人一区二区三区| 国产精品50p| 欧美激情日韩| 一区二区免费电影| 精品中文一区| 国产精品乱码一区二区三区| 欧美黄色成人| 国产精品69av| 欧美激情网站| 欧美国产乱视频| 黄网址在线观看| 国产亚洲xxx| 你懂的在线播放| 亚洲国产精品福利| 性生活三级视频| 777午夜精品视频在线播放| 无码一区二区三区在线观看| 午夜电影网一区| 欧美极品aaaaabbbbb| 日韩一区日韩二区| 九九热久久免费视频| 久久久精品2019中文字幕之3| 91超薄肉色丝袜交足高跟凉鞋| 精品一区二区三区香蕉蜜桃| 污版视频在线观看| 日韩av电影天堂| 免费激情视频在线观看| 欧美中文字幕| 久久精品99国产| 久久亚洲国产精品一区二区| 久久网站免费视频| 亚洲欧美日本日韩| 成人免费毛片网| 午夜宅男久久久| 日韩久久一级片| 日韩成人午夜电影| 爆乳熟妇一区二区三区霸乳| 老牛嫩草一区二区三区日本| 日韩一级在线免费观看| 天堂精品中文字幕在线| 一本大道熟女人妻中文字幕在线 | 亚洲综合色在线| 久久久久久久久99| 亚洲高清不卡在线观看| 国产精品18p| 欧美日韩国产在线看| 日韩成人高清视频| 欧美色xxxx| 天天综合久久综合| 欧美日韩一区精品| 国产精品久久久久久在线| 在线成人免费观看| xxxx国产精品| 亚洲精品美女在线观看| 国产精品国产高清国产| 亚洲性生活视频在线观看| 91在线视频| 欧美裸身视频免费观看| 24小时免费看片在线观看| 全亚洲最色的网站在线观看| 国产成人精选| 亚洲综合在线中文字幕| 大伊香蕉精品在线品播放| 蜜桃传媒视频麻豆一区| 久久福利综合| av在线免费观看国产| 国产日韩高清一区二区三区在线| 免费在线观看的毛片| 久久成人免费电影| 国产精品成人99一区无码 | 精品美女在线观看| 天堂中文资源在线| 在线成人中文字幕| 在线视频观看国产| 欧美综合第一页| 色综合视频一区二区三区日韩| 成人资源视频网站免费| 猛男gaygay欧美视频| 日本福利视频导航| 亚洲综合日韩| 毛片毛片毛片毛片毛| 99这里只有久久精品视频| 91成人精品一区二区| 亚洲一区二区精品久久av| 蜜臀99久久精品久久久久小说| 666欧美在线视频| 日本高清中文字幕二区在线| 久久精品2019中文字幕| 欧美a级在线观看| 成人免费淫片视频软件| 激情小说亚洲色图| 亚洲看片网站| 亚洲一区亚洲| 又大又长粗又爽又黄少妇视频| 久久久蜜桃精品| 久久精品这里只有精品| 在线看不卡av| 天堂中文网在线| 久久伊人91精品综合网站| 欧美激情喷水| 国产亚洲欧美一区二区三区| 天天做天天爱天天综合网| 久久久久久久激情| 国产成人精品免费| 在线视频这里只有精品| 色一情一伦一子一伦一区| 免费av一级片| 久久综合免费视频| 久久久精品一区二区毛片免费看| 国产精品区一区二区三在线播放 | 久久1电影院| 青青草视频在线视频| 精品一二线国产| 欧美亚洲色综久久精品国产| 日韩欧美亚洲成人| 亚洲成人精品女人久久久| 久久天天躁狠狠躁老女人| av在线日韩| 欧美少妇一区| 香蕉亚洲视频| 中文字幕 亚洲一区| 亚洲午夜在线电影| 亚洲av无码国产综合专区 | 伊人久久大香线蕉成人综合网| 老司机精品视频网站| 免费在线观看成年人视频| 精品人伦一区二区三区蜜桃网站 | 2018日韩中文字幕| 国产成人精品亚洲线观看| 日本福利视频网站| 国产精品 日产精品 欧美精品| 成人在线观看小视频| 欧美精品乱码久久久久久| 一广人看www在线观看免费视频| 国产成人精品在线视频| 国产精品美女久久久久久不卡 | 裸体裸乳免费看| 国产一区二区三区久久久| 中文字幕求饶的少妇| 91麻豆精品国产综合久久久久久| 麻豆视频在线免费观看| 亚洲一区二区三区久久 | 丰满人妻av一区二区三区| 久久大大胆人体| 日韩精品一区二区三区中文在线| 日韩中文在线字幕| 国产成人精品亚洲777人妖| 九九视频在线免费观看| 亚洲精品suv精品一区二区| 9lporm自拍视频区在线| 久久99精品久久久久子伦| 久久久综合网| 国产极品视频在线观看| 在线观看91av| а_天堂中文在线| 欧美成ee人免费视频| 秋霞午夜鲁丝一区二区老狼| 国产三级aaa| 日韩你懂的在线观看| 桃色av一区二区| 天堂资源在线亚洲视频| 久久99国产精品久久| 国产真实夫妇交换视频| 精品视频在线观看日韩| 国产精品传媒麻豆hd| 欧美激情亚洲天堂| 91看片淫黄大片一级在线观看| 中文字幕丰满人伦在线| 九九久久久久久久久激情| 欧美wwwsss9999| 性chinese极品按摩| 又紧又大又爽精品一区二区| 亚洲欧洲精品视频| 国产欧美日韩91| 亚洲精品在线二区| 少妇愉情理伦三级| 欧美成人video| 日韩三区在线| 久久人人爽人人爽人人av| 国产亚洲欧美一级| 国产丰满美女做爰| 国产97在线观看| 欧美激情视频一区二区三区免费| a级大片在线观看| 欧美一区二区三区免费视频| 欧美巨大丰满猛性社交| 超碰免费在线公开| 久久久久久97三级| www.黄色一片| 国产精品中文字幕在线| 亚洲国产片色| 亚洲综合视频网站| 亚洲最大在线视频|