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

JS基礎(chǔ)進階- 同步異步編程和EventLoop底層機制

開發(fā) 前端
本篇通過幾道面試題,和大家聊聊關(guān)于JS基礎(chǔ)進階之同步異步編程和EventLoop底層機制,希望能夠?qū)δ阌兴鶐椭?/div>

[[389054]]

簡短的概括:

  • JS中的單線程異步編程
  • EventLoop 事件循環(huán)機制
  • 宏任務 macrotask [ˈmækroʊ]
  • 微任務 microtask [ˈmaɪkroʊ]
  • JS中的同步異步編程

1、JS是單線程的,怎么達到異步編程:

1)JS是單線程的,大部分代碼都是同步編程。

2)JS中利用瀏覽器的多線程機制,基于單線程的EventLoop(事件循環(huán)機制)實現(xiàn)出異步的效果。

2、event loop (微任務與宏任務):

1)微任務 (microtask):優(yōu)先級高,并且可以插隊,不是先定義先執(zhí)行。包括:promise.then,async/await [generator],requestAnimationFrame,observer,MutationObserver,setImmediate。

2)宏任務 (macrotask):優(yōu)先級低,先定義的先執(zhí)行。包括:ajax,setTimeout,setInterval,事件綁定,postMessage,MessageChannel(用于消息通訊)。

3、根據(jù)事件循環(huán)機制,重新梳理一下流程:

+先找微任務隊列,如果微任務隊列中有,先從微任務隊列中,一般按照存放順序獲取并且去執(zhí)行。

+如果微任務隊列中沒有,則再去宏任務隊列中查找,在宏任務隊列中,一般是按照誰先到達執(zhí)行的條件,就先把誰拿出來執(zhí)行。

常考面試題:EventLoop事件循環(huán)

🌰 面試題1:

  1. console.log('1') // 1 
  2.  
  3. async function async1() { 
  4.   console.log('2') // 2 
  5.   await setTimeout(() => { 
  6.     console.log('3') // 8 
  7.   }, 0) 
  8.   console.log('4') // 5 
  9.  
  10. setTimeout(() => { 
  11.   console.log('5') // 7 
  12. }, 0) 
  13.  
  14. async1() 
  15.  
  16. new Promise(function (resolve) { 
  17.   console.log('6') // 3 
  18.   resolve() 
  19. }).then(function () { 
  20.   console.log('7') // 6 
  21. }) 
  22.  
  23. console.log('8') // 4 
  24. // 結(jié)果:1 2 6 8 4 7 5 3 

🌰 面試題2:

  1. async function async1() { 
  2.     console.log('async1 start'); // 2 
  3.     await async2(); 
  4.     console.log('async1 end'); // 6 
  5. async function async2() { 
  6.     console.log('async2'); // 3 
  7. console.log('script start'); // 1 
  8. setTimeout(function () { 
  9.     console.log('setTimeout'); // 8 
  10. }, 0) 
  11. async1(); 
  12. new Promise(function (resolve) { 
  13.     console.log('promise1'); // 4 
  14.     resolve(); 
  15. }).then(function () { 
  16.     console.log('promise2'); // 7 
  17. }); 
  18. console.log('script end'); // 5 
  19. //結(jié)果: 
  20. script start 
  21. async1 start 
  22. async2 
  23. promise1 
  24. script end 
  25. async1 end 
  26. promise2 
  27. setTimeout 

🌰 面試題3:

  1. console.log(1); // 1 
  2. setTimeout(() => { 
  3.   console.log(2); // 6 
  4.   Promise.resolve().then(data => { 
  5.      console.log(3); // 7 
  6.   }); 
  7. }); 
  8. new Promise((resolve) => { 
  9.   resolve() 
  10.   console.log(4) // 2 
  11. }).then(() => { 
  12.   console.log(5); // 4 
  13.   setTimeout(() => { 
  14.     console.log(6); // 8 
  15.   }); 
  16. }).then(() => console.log(7)) // 5 
  17. console.log(8); // 3 
  18.  
  19. // 結(jié)果:1, 4, 8, 5, 7, 2, 3, 6 
  20. 1, 4, 8 是同步  5, 7  是微任務  2 宏任務 3 微任務  6 宏任務 

進程/線程

* 核心答案 | 基礎(chǔ)知識要夯實

1) 進程代表的是一個程序(瀏覽器開一個頁卡 (Tab頁) 就是一個進程);

2) 線程是用來處理處理進程中的具體事物的,如果一個程序中需要同時做好多事情,就需要開辟好多線程;

3) 一個線程同時只能做一件事情;

  • 官方的說法
  • 1) 進程是cpu資源分配的最小單位(是能擁有資源和獨立運行的最小單位)。
  • 2) 線程是cpu調(diào)度的最小單位(線程是建立在進程的基礎(chǔ)上的一次程序運行單位,一個進程中可以有多個線程)。

瀏覽器是多線程的

* 核心答案 | 基礎(chǔ)知識要夯實

1) 瀏覽器是多進程的;

2) 瀏覽器之所以能夠運行,是因為系統(tǒng)給它的進程分配了資源(cpu、內(nèi)存);

3) 簡單點理解,每打開一個Tab頁,就相當于創(chuàng)建了一個獨立的瀏覽器進程;


那么接下來看看它都包含了哪些線程(列舉一些主要常駐線程)

GUI渲染線程

1) 負責渲染瀏覽器界面,解析HTML,CSS,構(gòu)建DOM樹和RenderObject樹,布局和繪制等。

2) 當界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時,該線程就會執(zhí)行。

3) 注意,GUI渲染線程與JS引擎線程是互斥的,當JS引擎執(zhí)行時GUI線程會被掛起(相當于被凍結(jié)了),GUI更新會被保存在一個隊列中等到JS引擎空閑時立即被執(zhí)行。

JS引擎線程

也稱為JS內(nèi)核,負責處理Javascript腳本程序。(例如V8引擎)

1) JS引擎線程負責解析Javascript腳本,運行代碼。

2) JS引擎一直等待著任務隊列中任務的到來,然后加以處理,一個Tab頁(renderer進程)中無論什么時候都只有一個JS線程在運行JS程序。

3) 同樣注意,GUI渲染線程與JS引擎線程是互斥的,所以如果JS執(zhí)行的時間過長,這樣就會造成頁面的渲染不連貫,導致頁面渲染加載阻塞。

JS中的單線程異步編程

* 核心答案 | 基礎(chǔ)知識要夯實

JS是單線程的:瀏覽器只分配一個線程用來渲染JS代碼。

1、JS中的代碼大部分都是“同步編程”:上面的任務沒有處理完成,下面的任務是無法處理的。

2、但是JS中利用瀏覽器的多線程機制,可以規(guī)劃出“異步編程”效果。

  • 定時器
  • ajax/Fetch/跨域 (HTTP網(wǎng)絡(luò)請求)
  • 事件綁定
  • Promise中有也有異步編程
  • Generator / yield
  • async / await

計算程序執(zhí)行的時間(預估)

1)運行監(jiān)控 console.time/timeEnd(受當前電腦運行環(huán)境的影響)

2)大O表示法(提前預估)

  1. console.time('AAA');  
  2. for (let i = 0; i < 99999999; i++) {}  
  3. console.timeEnd('AAA'); 

真實項目中應該避免死循環(huán) (重要)

  1. while (true) {} 
  2. console.log('OK'); // 不執(zhí)行:上述的死循環(huán)一直占用這“JS渲染線程”,線程空閑不下來,就處理不了其他的事情  

定時器的異步編程

1)設(shè)置定時器任務是同步的

2)“間隔interval這么長時間,執(zhí)行定時器綁定的函數(shù)” 這個任務是異步的

3)遇到異步任務,瀏覽器不會等待它執(zhí)行完,則繼續(xù)渲染下面的代碼;當?shù)鹊较旅娲a運行完,時間也到達了執(zhí)行的條件,才會把異步任務執(zhí)行;

  1. setTimeout(() => { 
  2.     console.log("OK"); //2 
  3. }, 1000); 
  4. console.log('NO'); //1 

interval設(shè)置為零也不是立即執(zhí)行,而是瀏覽器都有“最快反應時間(谷歌:5~6ms IE:13~17ms)”,設(shè)置為零,最快也需要等到5~6ms左右

  1. setTimeout(() => { 
  2.     console.log('OK'); //2 
  3. }, 0); 
  4. console.log('NO'); //1 

🌰 異步編程例子一:

  1. setTimeout(() => { 
  2.     console.log(1); 
  3. }, 20); 
  4. console.log(2); 
  5. setTimeout(() => { 
  6.     console.log(3); 
  7. }, 10); 
  8. console.log(4); 
  9. console.time('AA'); 
  10. for (let i = 0; i < 90000000; i++) { 
  11.     // do soming 
  12. console.timeEnd('AA'); //=>AA: 79ms 左右 
  13. console.log(5); 
  14. setTimeout(() => { 
  15.     console.log(6); 
  16. }, 8); 
  17. console.log(7); 
  18. setTimeout(() => { 
  19.     console.log(8); 
  20. }, 15); 
  21. console.log(9); 
  22. // 結(jié)果:2,4,5,7,9,3,1,6,8 

畫圖分析:( 有圖有真相 )


執(zhí)行順序:同步任務 —> 微任務 —> 宏任務 (微任務、宏任務在EventQueue)

  • 細節(jié)點
  • 當棧中的“同步任務”或者其它任務沒有執(zhí)行完之前,JS渲染線程不會空閑下來,些時哪怕定時器已經(jīng)到達指定時間,也不會執(zhí)行的。 “JS是單線程的,一次只能做一件事情” => 定時器設(shè)定的等待時間是最快觸發(fā)執(zhí)行的時間,很多時候,到時間不一定會執(zhí)行,只有JS渲染線程空閑下來才會執(zhí)行。

 

責任編輯:姜華 來源: 前端學苑
相關(guān)推薦

2012-07-27 10:02:39

C#

2019-05-27 14:40:43

Java同步機制多線程編程

2021-12-08 07:55:41

EventLoop瀏覽器事件

2021-09-06 13:12:05

前端JavaScript編程

2020-03-27 10:08:10

JS異步 I

2020-09-21 14:35:20

VuenextTick前端

2012-03-01 20:32:29

iOS

2013-03-08 09:33:25

JavaScript同步異步

2021-08-16 15:49:31

開發(fā)框架單線程異步

2019-01-17 10:58:52

JS異步編程前端

2012-06-14 13:55:39

JavaScript

2012-06-14 13:40:04

JavaScript

2015-07-03 10:12:04

編程同步非阻塞

2018-01-30 18:15:12

Python網(wǎng)絡(luò)爬蟲gevent

2010-01-15 09:15:09

Scala Actor并發(fā)

2013-04-01 15:38:54

異步編程異步編程模型

2019-07-23 11:01:57

Python同步異步

2023-09-07 08:15:58

場景同步異步

2019-02-27 16:00:48

JS原型原型鏈對象

2022-01-04 21:36:33

JS瀏覽器設(shè)計
點贊
收藏

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

主站蜘蛛池模板: 中文字幕在线观看视频一区 | 伊人精品在线 | 亚洲a人| 日韩精品极品视频在线观看免费 | 伊人网站在线 | 91精品国产综合久久香蕉922 | 亚洲免费精品 | av中文字幕在线 | 欧美一级大片 | aaa精品| 黄色在线免费观看 | 视频一区 亚洲 | 欧美高清一区 | 91精品久久久 | 亚洲精品久久久久久久久久久 | 一区二区三区在线免费观看 | 青青久久 | 久久久久亚洲精品国产 | 国产成人精品一区二 | 亚洲第一天堂 | 国产综合av | 成人av影院| 91久久国产综合久久91精品网站 | 久久九九99| 国产午夜三级一区二区三 | 91观看| 小草久久久久久久久爱六 | 欧美伦理一区 | 亚洲美女视频 | 91人人视频在线观看 | 二区在线观看 | 黄网站在线观看 | 蜜月aⅴ国产精品 | 九色视频网站 | 欧洲成人免费视频 | 亚洲一区二区在线 | 久久久综合精品 | 91精品国产色综合久久不卡蜜臀 | 欧美久久一级 | 日韩精品一区二区三区视频播放 | 亚洲精品1区 |