麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 語言 > JavaScript > 正文

淺談Javascript線程及定時機制

2024-05-06 16:22:42
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了淺談Javascript線程及定時機制的相關資料,需要的朋友可以參考下

setTimeout、setInterval的使用

Javascript api文檔中定義setTimeout和setInterval第二個參數意義分別為間隔多少毫秒后回調函數被執行和每隔多少毫秒回調函數被執行。但隨著工作經驗的積累,我們發現事實并非如此。

比如

 

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

就解釋不通了,立即執行就立即執行唄,干嘛還要設置個定時兜個圈子呢。

又有一天你寫了下面一段代碼

 

  
  1. setTimeout(function(){while(true){}},100); 
  2. setTimeout(function(){alert('你好');},200); 

第一行代碼死循環,結果造成第二行alert始終沒有出現,為啥哩?

單線程or多線程?

原來,Javascript引擎是單線程運行的,瀏覽器只有一個線程在運行JavaScript程序。因為單線程的設計,所以免去了復雜的多線程同步問題。

當設置一個定時的時候,瀏覽器會在設定的時間后將你指定的回調函數插入任務序列,而非立即執行。如果設定定時時間為0,表示立即插入任務序列,而不是立即執行,仍然要等隊列中任務執行完畢,輪到你,你才執行。

所以下面代碼先彈出2,再彈出1

 

 
  1. setTimeout(function(){ 
  2. alert(1); 
  3. },0); 
  4. alert(2); 

那么,這又有什么實際用途呢?且看下面示例

 

 
  1. <!DOCTYPE html> 
  2. <html> 
  3. <head> 
  4. <meta charset="utf-8"
  5. <meta name="viewport" content="width=device-width,initial-scale=1.0"
  6. <title>setTimeout 0</title> 
  7. </head> 
  8. <body> 
  9. 輸入字符,但內容卻不能實時顯示<input type="text" onkeydown="show(this.value)"/> <br/> 
  10. 輸入字符,內容能實時顯示<input type="text" onkeydown="var self=this;setTimeout(function(){show(self.value)},0)"/> 
  11. <div></div> 
  12. <script> 
  13. function show(val){ 
  14. document.getElementsByTagName("div")[0].innerHTML=val; 
  15. </script> 
  16. </body> 
  17. </html> 

這個例子中,js引擎需要執行keydown事件處理程序,然后更新輸入框的value值。事件處理程序執行時,更新value的任務只能進入隊列等待,所以keydown事件執行時無法得到更新后的value值;但通過setTimeout我們把取value的操作放入隊列,并在更新value之后執行,所以內容就能實時顯示了。

再回來看看下面的代碼:

 

 
  1. setTimeout(function(){ 
  2. //do something... 
  3. setTimeout(arguments.callee,10); 
  4. },10); 
  5.  
  6. setInterval(function(){ 
  7. //do something... 
  8. },10); 

這兩段代碼看起來效果一樣,是不是。其實還是有區別的,第一段的回調函數內的setTimeout是js引擎執行后再設定的新的定時,假定從上一個回調處理完到下一個回調開始為一個時間間隔,理論上時間間隔>=10ms,后一段代碼<=10ms。

說到這兒,那XMLHttpRequest是不是真的異步呢?是的,請求是異步的,不過這請求是瀏覽器新開的一個線程。當請求的狀態變更時,如果先前已設置回調,異步線程就將狀態變更事件放入js引擎處理隊列中等待處理,當任務被處理時js引擎始終還是單線程地執行onreadystatechange所設置的函數的。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 91av爱爱 | 国产精品一区二av18款 | 97久久精品一区二区三区观看 | 在线天堂资源 | 91在线视频观看 | av电影免费在线 | 日本网站在线播放 | 欧美中文字幕一区二区三区亚洲 | 欧美城网站地址 | 九色新网址 | 91短视频在线免费观看 | 91色成人 | 亚洲第一视频在线 | 久久久久久久一区二区 | 99精品国产一区二区三区 | 羞羞视频免费网站含羞草 | 国产日韩精品欧美一区视频 | sm高h视频 | 久久伊人国产精品 | 青青国产在线视频 | 久久精品久久精品久久精品 | 日韩精品免费一区二区三区 | 在线日韩亚洲 | 国产精品刺激对白麻豆99 | 久久亚洲激情 | 国产亚洲精品一区二区三区 | 国产精品啪一品二区三区粉嫩 | 极品大长腿啪啪高潮露脸 | 日韩视频精品一区 | 黄色电影免费提供 | 国产精品9191 | 97中文字幕在线观看 | 午夜a狂野欧美一区二区 | 亚洲成人国产综合 | 国产精品视频六区 | 毛片一区二区三区四区 | 欧美一级特黄aaaaaaa什 | 亚洲一区二区观看播放 | 国产黄色免费网站 | 在线看免费观看日本 | 午夜视频久久 |