成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript單線程 & setTimeout定時器

開發(fā) 前端
理解JavaScript的單線程的理念對于JavaScript學習,以及掌握其中的一些設計機制非常重要,比如回調、定時器。對于后續(xù)學習NodeJS也有很大的幫助。

理解JavaScript的單線程的理念對于JavaScript學習,以及掌握其中的一些設計機制非常重要,比如回調、定時器。對于后續(xù)學習NodeJS也有很大的幫助。

[[184669]]

通過先demo,后總結的形式,使得JavaScript的單線程更易于明白。

  1. 1 var a = 1;  //全局變量a 
  2. 2 function test(){ 
  3. 3     var a=2;  //test中變量a 
  4. 4     setTimeout(function(){ 
  5. 5         alert(a); //輸出test中變量a 
  6. 6         a=3;  //修改test中變量a 
  7. 7     },3000); 
  8. 8     a=4//修改test中變量a 
  9. 9     setTimeout(function(){ 
  10. 10         alert(a); //輸出test中變量a 
  11. 11         a=5//修改test中變量a 
  12. 12    },1000); 
  13. 13    alert(a); //輸出test中變量a 
  14. 14 } 
  15. 15 test(); //執(zhí)行test函數(shù) 
  16. 16 alert(a); //輸出全局變量a 
  17.  
  18. //運行結果:4 1 4 5  
  19. /* 結果解析:先輸出test()運行結果4,然后輸出之后一行代碼的1,然后1000ms之后輸出test()中的變量a=4,***3000ms之后輸出test()中的變量a=5 */ 
  20.  
  21. /* 
  22.   運行機制: 
  23.      1. JavaScript是單線程,從上往下依次執(zhí)行 
  24.      2. setTimeout異步方法存放在任務隊列中,JS主線程執(zhí)行完成之后,才會取任務隊列中的任務到JS主線程中執(zhí)行! 
  25.  
  26.      -> 先執(zhí)行15行,然后執(zhí)行16行 
  27.      -> 執(zhí)行15行,調用test()方法 
  28.      -> 調用test()方法,先創(chuàng)建一個a變量,然后將***個setTimeout放到setTimeout對應的線程中執(zhí)行(啟動定時器timer),第8行,修改test中變量a為4,然后將第二個setTimeout添加到setTimeout對應的線程隊列中執(zhí)行,執(zhí)行13行,輸出test中變量a,此時為4;然后執(zhí)行16行,輸出全局變量a,此時為1. 
  29.      -> 1000ms之后,將第二個setTimeout的回調函數(shù),添加到JS任務隊列中,3000ms后將***個setTimeout的回調函數(shù),添加到JS任務隊列中。 
  30.      -> JS主線程執(zhí)行完成之后,會執(zhí)行任務隊列的事件,第二個setTimeout優(yōu)先進入任務隊列,所以優(yōu)先執(zhí)行,執(zhí)行第10行,輸出test中的變量a,值為4,然后di11行,將test中的變量a修改為5;2000ms之后***個setTimeout進入任務隊列,此時JS主線程棧為空,所以將其添加到JS主線程進行執(zhí)行,第5行,輸出test中的變量a,此時變量的值為5,第6行修改test變量a為3. 
  31. */ 

由此延伸以下代碼:

  1. var a = 1
  2. var date = +new Date(); // 小技巧:通過"+"轉換為整數(shù) 
  3. function test(){ 
  4.     var a=2;  
  5.     setTimeout(function(){ 
  6.         console.log(a+'--'+ (new Date()-date)); 
  7.         a=3;  
  8.       },3000); 
  9.     a=4
  10.     setTimeout(function(){ 
  11.         console.log(a+'--'+ (new Date()-date)); 
  12.         a=5
  13.    },1000); 
  14.    console.log(a+'--'+ (new Date()-date)); 
  15. while(new Date-date <1000){ 
  16.  
  17. test(); 
  18. console.log(a+'--'+ (new Date()-date)); 
  19.  
  20. //執(zhí)行結果:4-1000 1-1001 4-2000 5-4001 

結合以下博客,整理一些重要概念:

http://www.ruanyifeng.com/blog/2014/10/event-loop.html

http://www.cnblogs.com/Mainz/p/3552717.html

1、作為腳本語言,JavaScript主要功能是與用戶互動,以及操作DOM。假定JavaScript同時有兩個線程,一個線程在某個DOM節(jié)點上添加內容,另一個線程刪除了這個節(jié)點,這時瀏覽器應該以哪個線程為準? ->So: JavaScript就是單線程。

2、JavaScript的任務分成兩種:同步任務和異步任務。同步任務:在主線程上排隊執(zhí)行的任務,只有上一個任務執(zhí)行完成了,才會執(zhí)行下一個任務。異步任務:不進入主線程,而進入“任務隊列”的任務,只有“任務隊列”通知主線程,某個任務隊列可以執(zhí)行了,等主線程執(zhí)行完成,任務隊列才會進入主線程執(zhí)行。 -> So:只要主線程空了,就會去讀“任務隊列”,這就是JavaScript的運行機制。

3、主線程從“任務隊列”中讀取事件,這個過程是循環(huán)不斷的,所以整個事件又叫“事件循環(huán)”(Event Loop)。

HTML5規(guī)定setTimeout()的第二個參數(shù)的最小值(最短間隔),不得低于4ms,如果低于4ms就會自動增加。在此之前,老版本瀏覽的都將最短時間設置為10ms。另外,對于那些DOM變動(尤其是設計頁面重新渲染的部分),通常不會立即執(zhí)行,而是每16ms執(zhí)行一次。這是使用requestAnimationFrame()的效果要好于setTimeout()。

4、需要注意的是:setTimeout只是將事件插入“事件隊列”,必須等到前面代碼(執(zhí)行棧)執(zhí)行完,主線程才會去執(zhí)行他指定的回調函數(shù)。如果當前代碼耗時很長,有可能要等很久,所以并沒有辦法保證,回調函數(shù)一定會在setTimeout()指定的是時間執(zhí)行。

Javascript是單線程,單線程就意味著所有任務需要排隊。然后會將所有任務分成兩類:同步任務和異步任務!同步任務:在主線程上執(zhí)行的任務,只有前一個任務執(zhí)行完成,才會執(zhí)行后一個!異步任務:不進入主線程、而進入“任務隊列”的任務。

Js是單線程的,但是瀏覽器是多線程的!瀏覽器是事件驅動的!

JS運行在瀏覽器中,是單線程的,每個window一個JS線程,但是瀏覽器不是單線程。可能有多個如下線程:

Javascript引擎線程、界面渲染線程、瀏覽器事件觸發(fā)線程、Http請求線程。

setTimeout可以改變,js執(zhí)行順序。比如:我們想要輸出Hello World,world必須在hello之后輸出,不管我們代碼的順序怎么樣都輸出同樣的效果,這個時候就可以借助setTimeout。

  1. //代碼一 
  2. var date =  +new Date(); 
  3. console.log('Hello',new Date()-date); 
  4. setTimeout(function(){ 
  5.      console.log('world',new Date()-date); 
  6. },500); 
  7.  
  8. //代碼二: 
  9. var date =  +new Date(); 
  10. setTimeout(function(){ 
  11.      console.log('World',new Date()-date); 
  12. },500); 
  13. console.log('Hello',new Date()-date); 
  14.  
  15. //以上兩個代碼運行結果一樣,結果都是:先輸出Hello ,然后500ms之后輸出World![實際運行:501ms] 

瀏覽器中定時器也是一個線程!

Javscript是單線程的,ajax請求確實是異步的!原因是ajax請求的時候,是在瀏覽器的Http請求線程中執(zhí)行的,執(zhí)行之后的回調函數(shù)會放到Javascript線程中執(zhí)行!

Summary:

     Javascript是單線程的,瀏覽器是多線程的,瀏覽器的線程包括:JS引擎線程、界面渲染線程、瀏覽器事件線程、Http請求線程。不過不同的瀏覽器提供的線程是有區(qū)別的。一般JS引擎線程和界面渲染線程是互斥的,兩個線程不能同時執(zhí)行,否則,就會出現(xiàn)界面渲染線程和JS線程修改同一個DOM樣式的矛盾問題!

責任編輯:張燕妮 來源: 開源中國社區(qū)
相關推薦

2024-02-26 00:00:00

JavaScript單線程高效

2010-08-30 08:55:56

JavaScript引

2009-07-10 09:05:20

SwingWorker

2021-01-10 11:21:33

JavaScript語言開發(fā)

2025-06-17 00:22:00

2020-11-09 09:33:37

多線程

2022-01-04 11:11:32

Redis單線程Reactor

2023-02-28 18:09:53

Javascript定時器

2010-01-28 16:45:44

Android單線程模

2025-04-24 08:15:00

Redis單線程線程

2012-08-07 09:27:40

JavaScript

2019-11-25 10:13:52

Redis單線程I

2024-09-27 11:51:33

Redis多線程單線程

2012-02-15 10:26:40

JavaJava Socket

2018-01-11 08:24:45

服務器模型詳解

2020-06-16 14:19:50

Javascript多線程編程

2019-06-17 14:20:51

Redis數(shù)據(jù)庫Java

2023-08-17 14:12:17

2023-10-15 12:23:10

單線程Redis

2020-10-30 16:20:38

Redis單線程高并發(fā)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女福利视频一区 | 一区二区三区视频在线观看 | 精品美女视频在线观看免费软件 | av片网站| 四虎在线播放 | 国产一区免费 | 色在线视频网站 | 99在线资源 | 欧美黄色大片在线观看 | 国产精品揄拍一区二区 | 色播久久久 | 国产一区二区三区 | 亚洲精品久久久 | 亚洲精品丝袜日韩 | 国产精品视频久久 | 国产一区二区在线播放 | 一区二区三区视频在线观看 | 亚洲一区不卡在线 | 2020亚洲天堂 | 日韩成人免费视频 | 亚州精品天堂中文字幕 | 国产日韩精品视频 | 久久性 | 成人欧美一区二区三区在线观看 | 日本在线小视频 | 国产精品美女久久久久久久久久久 | 中文字幕亚洲在线 | 国产精品久久久久久久久久三级 | 成人在线精品视频 | 久久久视| 国产视频中文字幕 | 国产精品成人一区二区 | 每日更新av| 久久99久久98精品免观看软件 | 国产有码 | 久久另类 | 岛国精品| 男人的天堂中文字幕 | 久久精品国产一区二区电影 | 日韩中文在线观看 | 欧美久久久|