亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

理解javascript定時器中的單線程

2019-11-20 10:31:59
字體:
來源:轉載
供稿:網友

一、JavaScript 引擎是單線程的

可以從下面的代碼中看到,第一個用setTimeout中的代碼是死循環,由于是單線程,下面的兩個定時器就沒機會執行了。

<script type="text/javascript"> setTimeout( function(){ while(true){} } , 100);  setTimeout( function(){ alert('你好!setTimeout'); } , 200);  setInterval( function(){ alert('你好!setInterval'); } , 200); </script>

瀏覽器的內核是多線程的,它們在內核制控下相互配合以保持同步,一個瀏覽器至少實現3個常駐線程:javascript引擎線程,GUI渲染線程,瀏覽器事件觸發線程。

JavaScript引擎是基于事件驅動單線程執行的,JS引擎一直等待著任務隊列中任務的到來然后加以處理,瀏覽器無論再什么時候都只有一個JS線程在運行JS程序。
GUI渲染線程負責渲染瀏覽器界面,當界面需要重繪(Repaint)或由于某種操作引發回流(reflow)時,該線程就會執行。但需要注意 GUI渲染線程與JS引擎是互斥的,當JS引擎執行時GUI線程會被掛起,GUI更新會被保存在一個隊列中等到JS引擎空閑時立即被執行。
瀏覽器事件觸發線程,當一個事件被觸發時該線程會把事件添加到待處理隊列的隊尾,等待JS引擎的處理。這些事件可來自JavaScript引擎當前執行的代碼塊如setTimeOut、也可來自瀏覽器內核的其他線程如鼠標點擊、AJAX異步請求等,但由于JS的單線程關系所有這些事件都得排隊等待JS引擎處理。

  由上圖可看出,瀏覽器中的JavaScript引擎是基于事件驅動的,這里的事件可看作是瀏覽器派給它的各種任務,JavaScript引擎一直等待著任務隊列中任務的到來,由于單線程關系,這些任務得進行排隊,一個接著一個被引擎處理。

t1、t2....tn表示不同的時間點,tn下面對應的小方塊代表該時間點的任務。

t1時刻:

1、GUI渲染線程
2、瀏覽器事件觸發線程:

在t1時間段內,首先是用戶點擊了一個鼠標鍵,點擊被瀏覽器事件觸發線程捕捉后形成一個鼠標點擊事件,由圖可知,對于JavaScript引擎線程來說,這事件是由其它線程異步傳到任務隊列尾的,由于引擎正在處理t1時的任務,這個鼠標點擊事件正在等待處理。
3、定時觸發線程:
這里的瀏覽器模型定時計數器并不是由JavaScript引擎計數的,因為JavaScript引擎是單線程的,如果處于阻塞線程狀態就計不了時,它必須依賴外部來計時并觸發定時,所以隊列中的定時事件是異步事件。
4、在這t1的時間段內,繼鼠標點擊事件觸發后,先前已設置的setTimeout定時也到達了,此刻對JavaScript引擎來說,定時觸發線程產生了一個異步定時事件并放到任務隊列中,該事件被排到點擊事件回調之后,等待處理。同理,還是在t1時間段內,接下來某個setInterval定時器也被添加了,由于是間隔定時,在t1段內連續被觸發了兩次,這兩個事件被排到隊尾等待處理。
5、ajax異步請求:
瀏覽器新開一個http線程請求,當請求的狀態變更時,如果先前已設置回調,這異步線程就產生狀態變更事件放到JavaScript引擎的處理隊列中等待處理。
二、任務的執行順序不同,顯示結果也不同

1)未使用setTimeout函數

在網上找到的一段代碼實例,這里用來演示一下。

<a href="#" id="doBtn">do something</a><div id="status"></div><script type="text/javascript">  var doBtn = document.getElementById('doBtn')   , status = document.getElementById('status');  function sleep(ms) {  var start = new Date();  while (new Date() - start <= ms) {}  }    doBtn.onclick = function(e) {   status.innerHTML = 'doing...please wait...';    sleep(3000); // 模擬一個耗時較長的計算過程,3s   status.innerHTML = 'done';    return false;  };</script>

我在firefox中執行了上面的代碼。計劃是點擊“do something”按鈕,然后顯示“doing...please wait...”,接著執行sleep,最后顯示“done”。

但是結果是點擊后,瀏覽器卡住3秒左右,最后直接顯示done。

分析下看出,在做status.innerHTML設置的時候,是需要執行GUI渲染線程的,但是現在還在執行JavaScript引擎線程,而JavaScript引擎線程與GUI渲染線程是互斥的,所以就最后顯示了done。

 2)使用了setTimeout函數

<a href="#" id="doBtn2">do something timer</a><div id="status2"></div><script type="text/javascript">  var doBtn2 = document.getElementById('doBtn2')   , status2 = document.getElementById('status2');  function sleep2(ms) {  var start = new Date();  while (new Date() - start <= ms) {}  }    doBtn2.onclick = function(e) {   status2.innerHTML = 'doing...please wait...';    setTimeout(function() {   sleep2(3000);    status2.innerHTML = 'done';    }, 100);    return false;  };</script>

在“doing...please wait...”后面加了個setTimeout,延時執行,給了瀏覽器渲染的時間,這個時候會顯示出“doing...please wait...”的字樣,然后執行sleep函數,最后顯示“done”。

后面有網友發現在firefox中不起作用,的確有這個問題,后面我修改了一下代碼,將局部變量的聲明,onclick的綁定放到了window.onload事件中,等頁面結構加載完成后,我再做腳本操作。

<script type="text/javascript">  function sleep(ms) {  //...  }  window.onload = function() {   var doBtn = document.getElementById('doBtn'),   status = document.getElementById('status');      var doBtn2 = document.getElementById('doBtn2')    , status2 = document.getElementById('status2');       doBtn.onclick = function(e) {    //...   };   doBtn2.onclick = function(e) {    //...   };  };</script>

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产成人在线观看| 亚洲精品丝袜日韩| 亚洲免费影视第一页| 国产一区二区黄| 91在线免费视频| 亚洲日本欧美中文幕| 91九色单男在线观看| 国色天香2019中文字幕在线观看| 日韩免费av片在线观看| 日韩欧美国产网站| 欧美日韩电影在线观看| 国产精品久久久久影院日本| 亚洲男人天堂手机在线| 一本色道久久综合狠狠躁篇的优点| 91免费电影网站| 亚洲欧美日韩综合| 日韩精品亚洲视频| 欧美性猛交xxxx富婆弯腰| 日韩女优人人人人射在线视频| 91久久精品美女高潮| 国内精品美女av在线播放| 欧美午夜久久久| 国产一区二区色| 97视频在线免费观看| 精品美女久久久久久免费| 久久精品久久久久久国产 免费| 一区二区三区国产视频| 在线日韩欧美视频| 亚洲成人av片在线观看| 国产高清视频一区三区| 国产精品老女人精品视频| 亚洲久久久久久久久久久| 91在线视频精品| 亚洲欧美日韩中文视频| 久久国产精彩视频| 大胆欧美人体视频| 亚洲成人网在线观看| 亚洲黄页视频免费观看| 欧美激情一区二区久久久| 精品人伦一区二区三区蜜桃网站| 97香蕉久久夜色精品国产| 日韩欧美国产骚| 78色国产精品| 欧美肥老太性生活视频| 国产在线观看91精品一区| 国产日韩综合一区二区性色av| 国产精品高潮呻吟久久av黑人| 亚洲色在线视频| 日本欧美精品在线| 亚洲激情在线观看| 欧美老少做受xxxx高潮| 亚洲跨种族黑人xxx| 亚洲精品在线视频| 九九视频这里只有精品| 成人xvideos免费视频| 欧美大片在线免费观看| 欧美黑人一区二区三区| 97在线看福利| 久久精品成人欧美大片古装| 欧美国产日韩精品| 国产精品成人一区二区三区吃奶| 日本久久久a级免费| 日韩成人xxxx| 亚洲va欧美va国产综合久久| 日韩美女在线看| 黄色成人av在线| 美女性感视频久久久| 精品中文字幕视频| 久久久精品视频在线观看| 俺去亚洲欧洲欧美日韩| 91在线视频精品| 亚洲a在线播放| 欧美老女人xx| 欧美高清在线视频观看不卡| 亚洲欧美一区二区三区情侣bbw| 亚洲欧美另类自拍| 亚洲一区二区少妇| 蜜臀久久99精品久久久久久宅男| 欧美激情视频一区| 久久久久久12| 18一19gay欧美视频网站| 欧美成人午夜免费视在线看片| 亚洲第一福利在线观看| 欧美高清在线观看| 国产成人一区二区三区电影| 亚洲xxxx在线| 国产精品久久不能| 欧美性感美女h网站在线观看免费| 欧美日韩亚洲激情| 久久久久久久91| 亚洲精品美女免费| 色偷偷88888欧美精品久久久| 欧美日本在线视频中文字字幕| 午夜精品视频在线| 欧美日韩一区二区在线| 国产精品黄页免费高清在线观看| 亚洲国产精品va在线看黑人动漫| 2021久久精品国产99国产精品| 日韩久久免费视频| 91久久国产精品| 亚洲国产成人精品女人久久久| 国产97在线视频| 日韩在线免费视频| 91成人免费观看网站| 亚洲日韩中文字幕在线播放| 日韩在线视频线视频免费网站| 国产成人精品电影| 26uuu国产精品视频| 亚洲一区二区黄| 国产精品一区二区电影| 国产精品丝袜白浆摸在线| 欧美性受xxx| 精品久久久精品| 欧美一级电影免费在线观看| 欧美在线亚洲一区| 亚洲一区二区三区在线免费观看| 精品五月天久久| 亚洲嫩模很污视频| 成人网在线视频| 一区二区三区四区视频| 性色av一区二区三区| 亚洲美女性视频| 国产精品极品美女在线观看免费| 成人97在线观看视频| 欧美成人激情视频| 欧美网站在线观看| 日韩国产在线看| 久久国产精品免费视频| 92福利视频午夜1000合集在线观看| 国产成人av网址| 亚洲色图激情小说| 日本中文字幕不卡免费| 伊人久久久久久久久久久久久| 成人午夜在线影院| 日韩精品在线观看网站| 国产精品视频免费观看www| 欧美成人精品在线视频| 欧美日韩免费在线| 中文国产成人精品| 91精品久久久久久| 欧美激情在线狂野欧美精品| 国产黑人绿帽在线第一区| 亚洲欧洲在线看| 亚洲高清久久久久久| 国产精品一香蕉国产线看观看| 亚洲va电影大全| 国产亚洲免费的视频看| 国产精品成熟老女人| 亚洲国产精品系列| 久久视频在线免费观看| 91伊人影院在线播放| 成人久久久久久| 亚洲黄色免费三级| 亚洲男人天堂古典| 欧美性生交xxxxxdddd| 中文字幕一区二区三区电影| 国产suv精品一区二区| 久久在线免费视频| 亚洲色图狂野欧美| 国产欧美日韩丝袜精品一区| 97在线视频国产| 欧美成人免费视频| 国产69精品久久久久9999| 午夜伦理精品一区|