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

拔開云霧見明月 透析JavaScript定時機(jī)制

開發(fā) 前端
很多開發(fā)者在使用JavaScript定時機(jī)制時,會陷入很多誤區(qū)。文章用實際案例分析了JavaScript定時機(jī)制的原理,希望對您有所幫助。

JavaScript的setTimeout與setInterval是兩個很容易欺騙“別人感情”的方法,因為我們開始常常以為調(diào)用了就會按既定的方式執(zhí)行, 我想不少人都深有同感, 例如:

51CTO推薦閱讀:JavaScript語法中12個需要繞開的陷阱

  1. setTimeout( function(){ alert(’你好!’); } , 0);  
  2. setInterval( callbackFunction , 100); 

認(rèn)為setTimeout中的問候方法會立即被執(zhí)行,因為這并不是憑空而說,而是JavaScript API文檔明確定義第二個參數(shù)意義為隔多少毫秒后,回調(diào)方法就會被執(zhí)行. 這里設(shè)成0毫秒,理所當(dāng)然就立即被執(zhí)行了。同理對setInterval的callbackFunction方法每間隔100毫秒就立即被執(zhí)行深信不疑!但隨著JavaScript應(yīng)用開發(fā)經(jīng)驗不斷的增加和豐富,有一天你發(fā)現(xiàn)了一段怪異的代碼而百思不得其解:

  1. div.onclick = function(){  
  2. setTimeout( function()  
  3. {document.getElementById(’inputField’).focus();}, 0);  
  4. }; 

既然是0毫秒后執(zhí)行,那么還用setTimeout干什么, 此刻, 堅定的信念已開始動搖,直到最后某一天 , 你不小心寫了一段糟糕的代碼:

  1. setTimeout( function(){ while(true){} } , 100);  
  2. setTimeout( function(){ alert(’你好!’); } , 200);  
  3. setInterval( callbackFunction , 200); 

第一行代碼進(jìn)入了死循環(huán),但不久你就會發(fā)現(xiàn),第二,第三行并不是預(yù)料中的事情,alert問候未見出現(xiàn),callbacKFunction也杳無音訊!這時你徹底迷惘了,這種情景是難以接受的,因為改變長久以來既定的認(rèn)知去接受新思想的過程是痛苦的,但情事實擺在眼前,對JavaScript真理的探求并不會因為痛苦而停止,下面讓我們來展開JavaScript線程和定時器探索之旅!

出現(xiàn)上面所有誤區(qū)的最主要一個原因是:潛意識中認(rèn)為,JavaScript引擎有多個線程在執(zhí)行,JavaScript的定時器回調(diào)函數(shù)是異步執(zhí)行的,而事實上的,JavaScript使用了障眼法,在多數(shù)時候騙過了我們的眼睛,這里背光得澄清一個事實:

JavaScript引擎是單線程運(yùn)行的,瀏覽器無論在什么時候都只且只有一個線程在運(yùn)行JavaScript程序.

JavaScript引擎用單線程運(yùn)行也是有意義的,單線程不必理會線程同步這些復(fù)雜的問題,問題得到簡化.那么單線程的JavaScript引擎是怎么配合瀏覽器內(nèi)核處理這些定時器和響應(yīng)瀏覽器事件的呢?下面結(jié)合瀏覽器內(nèi)核處理方式簡單說明。

瀏覽器內(nèi)核實現(xiàn)允許多個線程異步執(zhí)行,這些線程在內(nèi)核制控下相互配合以保持同步.假如某一瀏覽器內(nèi)核的實現(xiàn)至少有三個常駐線 程:javascript引擎線程,界面渲染線程,瀏覽器事件觸發(fā)線程,除些以外,也有一些執(zhí)行完就終止的線程,如Http請求線程,這些異步線程都會產(chǎn) 生不同的異步事件,下面通過一個圖來闡明單線程的JavaScript引擎與另外那些線程是怎樣互動通信的.雖然每個瀏覽器內(nèi)核實現(xiàn)細(xì)節(jié)不同,但這其中的調(diào)用原理都是大同小異.

瀏覽器內(nèi)核

由圖可看出,瀏覽器中的JavaScript引擎是基于事件驅(qū)動的,這里的事件可看作是瀏覽器派給它的各種任務(wù),這些任務(wù)可以源自 JavaScript引擎當(dāng)前執(zhí)行的代碼塊,如調(diào)用setTimeout添加一個任務(wù),也可來自瀏覽器內(nèi)核的其它線程,如界面元素鼠標(biāo)點(diǎn)擊事件,定時觸發(fā)器時間到達(dá)通知,異步請求狀態(tài)變更通知等.從代碼角度看來任務(wù)實體就是各種回調(diào)函數(shù),JavaScript引擎一直等待著任務(wù)隊列中任務(wù)的到來.由于單線 程關(guān)系,這些任務(wù)得進(jìn)行排隊,一個接著一個被引擎處理.

上圖t1-t2..tn表示不同的時間點(diǎn),tn下面對應(yīng)的小方塊代表該時間點(diǎn)的任務(wù),假設(shè)現(xiàn)在是t1時刻,引擎運(yùn)行在t1對應(yīng)的任務(wù)方塊代碼內(nèi),在這個時間點(diǎn)內(nèi),我們來描述一下瀏覽器內(nèi)核其它線程的狀態(tài).

#p#

t1時刻:

◆GUI渲染線程:

該線程負(fù)責(zé)渲染瀏覽器界面HTML元素,當(dāng)界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時,該線程就會執(zhí)行.本文雖然重 點(diǎn)解釋JavaScript定時機(jī)制,但這時有必要說說渲染線程,因為該線程與JavaScript引擎線程是互斥的,這容易理解,因為 JavaScript腳本是可操縱DOM元素,在修改這些元素屬性同時渲染界面,那么渲染線程前后獲得的元素數(shù)據(jù)就可能不一致了.

在JavaScript引擎運(yùn)行腳本期間,瀏覽器渲染線程都是處于掛起狀態(tài)的,也就是說被”凍結(jié)”了.所以,在腳本中執(zhí)行對界面進(jìn)行更新操作,如添加結(jié)點(diǎn),刪除結(jié)點(diǎn)或改變結(jié)點(diǎn)的外觀等更新并不會立即體現(xiàn)出來,這些操作將保存在一個隊列中,待JavaScript引擎空閑時才有機(jī)會渲染出來.

◆GUI事件觸發(fā)線程:

JavaScript腳本的執(zhí)行不影響html元素事件的觸發(fā),在t1時間段內(nèi),首先是用戶點(diǎn)擊了一個鼠標(biāo)鍵,點(diǎn)擊被瀏覽器事件觸發(fā)線程捕捉后形成 一個鼠標(biāo)點(diǎn)擊事件,由圖可知,對于JavaScript引擎線程來說,這事件是由其它線程異步傳到任務(wù)隊列尾的,由于引擎正在處理t1時的任務(wù),這個鼠標(biāo) 點(diǎn)擊事件正在等待處理.

◆定時觸發(fā)線程:

注意這里的瀏覽器模型定時計數(shù)器并不是由JavaScript引擎計數(shù)的,因為JavaScript引擎是單線程的,如果處于阻塞線程狀態(tài)就計不了時,它必須依賴外部來計時并觸發(fā)定時,所以隊列中的定時事件也是異步事件.

由圖可知,在這t1的時間段內(nèi),繼鼠標(biāo)點(diǎn)擊事件觸發(fā)后,先前已設(shè)置的setTimeout定時也到達(dá)了,此刻對JavaScript引擎來說,定時觸發(fā)線程產(chǎn)生了一個異步定時事件并放到任務(wù)隊列中, 該事件被排到點(diǎn)擊事件回調(diào)之后,等待處理.同理, 還是在t1時間段內(nèi),接下來某個setInterval定時器也被添加了,由于是間隔定時,在t1段內(nèi)連續(xù)被觸發(fā)了兩次,這兩個事件被排到隊尾等待處理.

可見,假如時間段t1非常長,遠(yuǎn)大于setInterval的定時間隔,那么定時觸發(fā)線程就會源源不斷的產(chǎn)生異步定時事件并放到任務(wù)隊列尾而不管它 們是否已被處理,但一旦t1和最先的定時事件前面的任務(wù)已處理完,這些排列中的定時事件就依次不間斷的被執(zhí)行,這是因為,對于JavaScript引擎來 說,在處理隊列中的各任務(wù)處理方式都是一樣的,只是處理的次序不同而已.

t1過后,也就是說當(dāng)前處理的任務(wù)已返回,JavaScript引擎會檢查任務(wù)隊列,發(fā)現(xiàn)當(dāng)前隊列非空,就取出t2下面對應(yīng)的任務(wù)執(zhí)行,其它時間依此類推,由此看來:如果隊列非空,引擎就從隊列頭取出一個任務(wù),直到該任務(wù)處理完,即返回后引擎接著運(yùn)行下一個任務(wù),在任務(wù)沒返回前隊列中的其它任務(wù)是沒法被執(zhí)行的.

相信您現(xiàn)在已經(jīng)很清楚JavaScript是否可多線程,也了解理解JavaScript定時器運(yùn)行機(jī)制了,下面我們來對一些案例進(jìn)行分析:

案例1:setTimeout與setInterval

  1. setTimeout(function(){   /* 代碼塊... */     
  2. setTimeout(arguments.callee, 10);}, 10);  
  3. setInterval(function(){   /*代碼塊... */ }, 10); 

這兩段代碼看一起效果一樣,其實非也,第一段中回調(diào)函數(shù)內(nèi)的setTimeout是JavaScript引擎執(zhí)行后再設(shè)置新的setTimeout 定時, 假定上一個回調(diào)處理完到下一個回調(diào)開始處理為一個時間間隔,理論兩個setTimeout回調(diào)執(zhí)行時間間隔>=10ms .第二段自setInterval設(shè)置定時后,定時觸發(fā)線程就會源源不斷的每隔十秒產(chǎn)生異步定時事件并放到任務(wù)隊列尾,理論上兩個setInterval 回調(diào)執(zhí)行時間間隔<=10.

案例2:Ajax異步請求是否真的異步?

很多同學(xué)朋友搞不清楚,既然說JavaScript是單線程運(yùn)行的,那么XMLHttpRequest在連接后是否真的異步?其實請求確實是異步的,不過這請求是由瀏覽器新開一個線程請求。

當(dāng)請求的狀態(tài)變更時,如果先前已設(shè)置回調(diào),這異步線程就產(chǎn)生狀態(tài)變更事件放到 JavaScript引擎的處理隊列中等待處理,當(dāng)任務(wù)被處理時,JavaScript引擎始終是單線程運(yùn)行回調(diào)函數(shù),具體點(diǎn)即還是單線程運(yùn)行onreadystatechange所設(shè)置的函數(shù).

【編輯推薦】

  1. JavaScript中的函數(shù)式編程實踐
  2. 深入解讀JavaScript中BOM和DOM
  3. 揭開Javascript閉包的真實面目
  4. 詳解Javascript框架中的全局變量
  5. 詳解Javascript中checkbox樹的功能
責(zé)任編輯:王曉東 來源: 百度空間
相關(guān)推薦

2011-06-28 09:37:15

phpMyAdminMySQL

2025-07-07 03:00:00

2018-07-25 11:08:38

新華三鷹視網(wǎng)絡(luò)

2022-07-14 08:36:28

NacosApollo長輪詢

2014-11-05 15:38:28

無線傲天動聯(lián)

2012-06-12 09:21:53

JavaScript

2010-09-06 10:56:54

2018-01-03 12:23:15

云計算邊緣計算

2016-09-19 14:09:52

戴爾

2009-09-10 10:37:19

服務(wù)器維護(hù)

2009-08-28 09:43:05

C#事件

2009-10-13 14:51:00

CCIE考試

2010-11-03 15:52:55

數(shù)據(jù)倉庫

2010-07-23 09:37:06

云計算本質(zhì)服務(wù)

2015-05-25 09:10:22

Intel

2009-06-12 14:31:59

Google WaveGoogle Wave

2010-01-22 13:45:36

C++代碼

2010-01-18 09:39:25

C++語言

2010-01-19 14:28:41

C++ main()函

2010-10-14 10:54:09

企業(yè)無線局域網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

最近中文字幕免费| 男人添女人下部视频免费| 波多野结衣视频在线观看| 成人情趣视频网站| 欧美一区二视频| 欧美精品久久久久久久久久久| 欧美日韩国产综合视频| 九九热在线视频观看这里只有精品| 18涩涩午夜精品.www| 91黄在线观看| 亚洲国产成人无码av在线| 青青草原综合久久大伊人精品 | 国产主播在线播放| 婷婷激情一区| 91欧美激情一区二区三区成人| 国产精品久久久久久久久久三级| 高h视频免费观看| 国产精选一区| 一本色道久久加勒比精品 | 番号集在线观看| 国产老女人精品毛片久久| 人人澡人人澡人人看欧美| 91n在线视频| 成人涩涩视频| 性做久久久久久| 亚洲aⅴ天堂av在线电影软件| 亚洲国产精品成人久久蜜臀| 欧美a级理论片| 欧美亚洲国产日本| 久久精品一区二区免费播放| 999精品嫩草久久久久久99| 欧美日韩亚洲一区二区三区| 日本福利视频网站| 99re在线视频| 久久精品噜噜噜成人av农村| 91豆花精品一区| 欧美黑人性猛交xxx| 日韩精品一区二区三区免费观影| 日韩av在线网| 中文字幕在线视频播放| 视频二区欧美| 欧美一卡二卡三卡| 中文字幕22页| av超碰免费在线| 亚洲国产高清aⅴ视频| 久久久久久久久久久久久9999| 精品人妻一区二区三区日产乱码| 精品91视频| 久久这里有精品视频| 精品一区二区在线观看视频| 国产一区不卡| 亚洲偷熟乱区亚洲香蕉av| 少妇精品一区二区三区| 久久悠悠精品综合网| 精品日韩一区二区三区免费视频| 红桃视频一区二区三区免费| 亚洲伊人精品酒店| 6080yy午夜一二三区久久| 波多野结衣xxxx| 国产成人精选| 欧美高清激情brazzers| 亚洲最大成人在线观看| 国产资源一区| 在线成人av网站| 天天久久综合网| 亚洲日本视频在线| 精品电影一区二区三区| 中文在线观看免费视频| 日韩中文av| 中文字幕不卡在线视频极品| 国产又色又爽又高潮免费| 99久久国产综合精品成人影院| www.午夜精品| 欧美精品videos极品| 亚洲福利免费| 日韩av成人在线观看| 涩涩视频在线观看| 国产一区二区三区四| 66m—66摸成人免费视频| 日韩免费av片| 母乳一区在线观看| 美女少妇精品视频| 黄免费在线观看| 青青草91久久久久久久久| xxxx欧美18另类的高清| 欧美精品久久久久性色| 国产精品毛片在线看| 国产精品热视频| 国产乱淫av免费| 久久久久中文| 国产欧美日韩中文| 亚洲女人18毛片水真多| 久久久蜜桃精品| 在线综合视频网站| 成人影音在线| 欧美性猛交xxxx乱大交退制版| 第一区免费在线观看| 久久夜色电影| 久久综合亚洲社区| 天天操天天操天天操天天| 久久精品国产77777蜜臀| 国产精品sss| av中文在线| 亚洲韩国精品一区| 91看片淫黄大片91| 黑森林国产精品av| 欧美精品久久99久久在免费线| 美女露出粉嫩尿囗让男人桶| 国产亚洲一区二区三区不卡| 欧美成人免费全部观看天天性色| 视频一区二区三区四区五区| 国产精品一级二级三级| 日本一区二区三区在线视频| 色呦呦在线播放| 欧美三区免费完整视频在线观看| 中文字幕第九页| 我不卡伦不卡影院| 青草青草久热精品视频在线网站| 国产视频一二三四区| 极品少妇xxxx精品少妇偷拍| 国产精品一区二区久久精品| 五月天丁香视频| 91丨九色丨黑人外教| 吴梦梦av在线| 综合在线影院| 日韩电影视频免费| 欧美丰满艳妇bbwbbw| 老司机午夜精品| 区一区二区三区中文字幕| 国产精品探花在线| 555www色欧美视频| 日本一二三不卡视频| 不卡av一区二区| 欧美诱惑福利视频| 人妻夜夜爽天天爽| 亚洲一区二区中文在线| 日本高清一区二区视频| 日本一二区不卡| 国产91九色视频| 污视频网站在线播放| 亚洲女女做受ⅹxx高潮| 五月花丁香婷婷| 98精品视频| 成人黄色大片在线免费观看| 在线视频二区| 欧美日韩免费一区二区三区视频 | japanese国产在线观看| 91在线观看污| 337p粉嫩大胆噜噜噜鲁| 久久动漫网址| 欧美性做爰毛片| 日韩av资源站| 色婷婷综合激情| 一色道久久88加勒比一| 久久夜色精品| 日本三级中国三级99人妇网站| 国产伦精品一区二区三区视频金莲| 日韩国产欧美精品在线| 日韩精品手机在线| 久久亚洲综合av| 一区二区三区四区视频在线| 欧美在线va视频| 色99之美女主播在线视频| 中文字幕在线2018| 国产成人在线视频免费播放| 国产成人三级视频| 日韩国产在线不卡视频| 欧美国产第一页| 无码国产伦一区二区三区视频| 欧美日韩性生活视频| www在线观看免费视频| 日韩vs国产vs欧美| 波多野结衣三级在线| 日韩视频一区二区三区四区| 久久久久久亚洲精品中文字幕| 少妇人妻精品一区二区三区| 在线视频国内自拍亚洲视频| 亚洲一级二级片| 国产成人h网站| 日韩av资源在线| 熟妇熟女乱妇乱女网站| 影视一区二区三区| 色妞色视频一区二区三区四区| 国产日韩在线观看一区| 午夜精品久久久久久久| 国产精成人品免费观看| 国内久久婷婷综合| 性欧美大战久久久久久久| 免费成人高清在线视频theav| 国产精品亚洲综合天堂夜夜| 在线āv视频| 日韩精品免费综合视频在线播放| 波多野结衣一区二区三区四区| 18涩涩午夜精品.www| 91九色蝌蚪porny| 日韩一区精品字幕| 久久综合亚洲精品| 国产欧美日韩在线观看视频| 91久久久精品| 二区三区不卡| 欧美大片免费看| 丝袜美腿美女被狂躁在线观看| 日韩三级中文字幕| 懂色av中文字幕| 亚洲一线二线三线视频| 2019男人天堂| av成人老司机| 伊人再见免费在线观看高清版 | 日本一区不卡| 亚洲精品v亚洲精品v日韩精品| 日本精品性网站在线观看| 日韩av激情| 精品国内亚洲在观看18黄| 日本视频在线观看一区二区三区| 91麻豆精品国产91久久久久久| 天堂中文在线网| 亚洲成人在线观看视频| 国产精品熟妇一区二区三区四区| 秋霞午夜鲁丝一区二区老狼| a级黄色一级片| 午夜久久一区| 亚洲欧美综合一区| 夜夜春成人影院| 国产xxx69麻豆国语对白| 在线中文免费视频| www.精品av.com| 成人在线高清视频| 亚洲精品视频在线观看视频| 成人乱码一区二区三区| 欧美精品久久久久久久多人混战| 欧美在线视频精品| 一本大道av伊人久久综合| 国产精品第9页| 亚洲午夜久久久久久久久电影院| 秋霞欧美一区二区三区视频免费| 久久久久9999亚洲精品| 疯狂揉花蒂控制高潮h| 久久精品男女| 免费看国产曰批40分钟| 亚洲国产高清一区| 欧美国产综合在线| 欧美女人交a| av在线免费观看国产| 欧美激情性爽国产精品17p| 欧美 日韩 国产 在线观看| 久久香蕉国产| 在线视频亚洲自拍| 51精产品一区一区三区| 国产高清免费在线| 亚洲最新av| 国产对白在线播放| 一区二区日韩欧美| 日本a级片在线观看| 午夜久久美女| 欧美久久久久久久久久久久久| 99在线精品视频在线观看| 欧美精品久久久久久久免费| 亚洲一区网站| 黄色片久久久久| 日韩av电影天堂| 国产三级精品三级在线| 国产黄色精品视频| 国产视频精品视频| 91在线免费视频观看| 永久免费成人代码| 国产精品久久久久久久久搜平片 | 波多野结衣久草一区| 日韩精品视频在线看| 国产99在线免费| 全球av集中精品导航福利| 国产精品一区二区三区在线播放 | 久久影院理伦片| 国产探花一区二区| 在线免费观看一区二区三区| 午夜日韩激情| 欧美日韩在线视频一区二区三区| 日韩中文字幕av电影| 99中文字幕在线| 成人国产亚洲欧美成人综合网| 亚洲午夜福利在线观看| 中文字幕一区二区三区色视频| 国产高清在线免费观看| 欧美小视频在线| 国产精品久久久久久无人区| 亚洲成av人片在线观看香蕉| 国产色a在线| 欧美猛交免费看| 欧美黑人粗大| 91最新国产视频| 精品一区欧美| 国产高清不卡无码视频| 久久精品一区二区国产| 九九九九九伊人| xnxx国产精品| 爱爱视频免费在线观看| 日韩欧美在线字幕| 国产免费一区二区三区免费视频| 亚洲黄色成人网| 丰满少妇在线观看bd| 亚洲深夜福利在线| 久久免费电影| 国产精品夜色7777狼人| 欧美在线导航| 中文字幕精品在线播放| 久热精品视频| 国产免费一区二区三区最新6| 国产精品免费久久久久| 欧美一区二区三区四| 精品国产成人av| 国产又大又黑又粗| 亚洲欧美国产一本综合首页| 超碰在线免费播放| 国产精品爽黄69天堂a| 偷拍亚洲色图| 免费超爽大片黄| 国产伦精品一区二区三区在线观看 | 成人网页在线观看| 91高清免费看| 精品视频全国免费看| 日韩大片b站免费观看直播| 欧美极品少妇xxxxⅹ喷水| 欧美成人毛片| 欧美不卡三区| 亚洲免费中文| aa片在线观看视频在线播放| 一区二区三区四区亚洲| 亚洲字幕av一区二区三区四区| 日韩精品中文字幕有码专区| 麻豆av在线免费观看| 91在线|亚洲| 久久国产精品成人免费观看的软件| 日本久久久精品视频| av男人天堂一区| 日本中文字幕免费观看| 精品少妇一区二区三区日产乱码 | 亚洲女则毛耸耸bbw| 亚洲人成网站精品片在线观看 | 色久综合一二码| 在线播放亚洲精品| 亚洲人成网站色ww在线| 老色鬼在线视频| 韩国成人av| 99国产精品| 亚洲国产第一区| 婷婷激情综合网| 欧美日韩伦理片| 国产成一区二区| 欧美亚洲在线日韩| 五月婷婷深爱五月| 欧美国产日韩亚洲一区| 中国老头性行为xxxx| 色婷婷av一区二区三区久久| 国产精品99| ijzzijzzij亚洲大全| 国产成人综合亚洲网站| 久草视频在线资源站| 欧美精品一区二区久久婷婷| 182在线视频观看| 久久草.com| 老色鬼久久亚洲一区二区| 美女爆乳18禁www久久久久久 | 人妻少妇精品无码专区久久| 91精品国产色综合久久不卡98| 六月丁香久久丫| av动漫免费看| 中文字幕亚洲在| www日本高清| 91av视频在线免费观看| 国产一区二区三区站长工具| 天堂av2020| 亚洲国产aⅴ天堂久久| 日本v片在线免费观看| 国产精品美女www| 亚洲色图插插| 国产精品无码毛片| 欧美系列日韩一区| 羞羞网站在线看| 蜜桃av色综合| 久久国产精品区| 精品午夜福利在线观看| 亚洲精品永久免费精品| 9999在线精品视频| 国产免费观看高清视频| 国产精品国产三级国产有无不卡| 精品国产av一区二区| 欧美做爰性生交视频| 中文在线日韩| 亚洲国产精品成人综合久久久| 欧美日韩日日摸| 国产自产自拍视频在线观看| 婷婷五月色综合| 成人性视频免费网站| 黄色一区二区视频| 欧美激情网站在线观看| 国产va免费精品观看精品视频| 欧美日韩久久婷婷| 日韩欧亚中文在线| av网站网址在线观看| 青娱乐国产91| 99这里都是精品|