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

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

開發 前端
本篇通過幾道面試題,和大家聊聊關于JS基礎進階之同步異步編程和EventLoop底層機制,希望能夠對你有所幫助!

[[389054]]

簡短的概括:

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

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

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

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

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

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

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

3、根據事件循環機制,重新梳理一下流程:

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

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

常考面試題:EventLoop事件循環

🌰 面試題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. // 結果: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. //結果: 
  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. // 結果:1, 4, 8, 5, 7, 2, 3, 6 
  20. 1, 4, 8 是同步  5, 7  是微任務  2 宏任務 3 微任務  6 宏任務 

進程/線程

* 核心答案 | 基礎知識要夯實

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

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

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

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

瀏覽器是多線程的

* 核心答案 | 基礎知識要夯實

1) 瀏覽器是多進程的;

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

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


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

GUI渲染線程

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

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

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

JS引擎線程

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

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

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

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

JS中的單線程異步編程

* 核心答案 | 基礎知識要夯實

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

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

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

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

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

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

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

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

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

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

定時器的異步編程

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

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

3)遇到異步任務,瀏覽器不會等待它執行完,則繼續渲染下面的代碼;當等到下面代碼運行完,時間也到達了執行的條件,才會把異步任務執行;

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

interval設置為零也不是立即執行,而是瀏覽器都有“最快反應時間(谷歌:5~6ms IE:13~17ms)”,設置為零,最快也需要等到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. // 結果:2,4,5,7,9,3,1,6,8 

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


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

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

 

責任編輯:姜華 來源: 前端學苑
相關推薦

2012-07-27 10:02:39

C#

2021-12-08 07:55:41

EventLoop瀏覽器事件

2019-05-27 14:40:43

Java同步機制多線程編程

2021-09-06 13:12:05

前端JavaScript編程

2020-09-21 14:35:20

VuenextTick前端

2020-03-27 10:08:10

JS異步 I

2012-03-01 20:32:29

iOS

2013-03-08 09:33:25

JavaScript同步異步

2012-06-14 13:40:04

JavaScript

2012-06-14 13:55:39

JavaScript

2019-01-17 10:58:52

JS異步編程前端

2021-08-16 15:49:31

開發框架單線程異步

2015-07-03 10:12:04

編程同步非阻塞

2010-01-15 09:15:09

Scala Actor并發

2019-07-23 11:01:57

Python同步異步

2018-01-30 18:15:12

Python網絡爬蟲gevent

2013-04-01 15:38:54

異步編程異步編程模型

2023-09-07 08:15:58

場景同步異步

2019-02-27 16:00:48

JS原型原型鏈對象

2022-01-04 21:36:33

JS瀏覽器設計
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品乱码久久久久久久久久 | 中文字幕11页 | 一区二区三区四区在线视频 | 男女又爽又黄视频 | 精品久久久久久久人人人人传媒 | 国产成人精品亚洲日本在线观看 | av网址在线 | 日韩国产欧美一区 | 国产中文原创 | av在线一区二区三区 | 一区视频在线免费观看 | 免费国产黄| 欧美综合在线观看 | 欧美成人一区二区三区 | 久久99国产精一区二区三区 | 日韩毛片 | 日韩免费视频一区二区 | 久久精品国产亚洲 | 91亚洲精华国产 | 欧美精品国产精品 | 欧美一区二区三区视频在线播放 | www.久久久.com| 日本一区二区三区在线观看 | 国产色婷婷精品综合在线播放 | 中文字幕在线一区 | 亚洲成人免费在线观看 | 欧美a在线看| 亚洲成人自拍 | 国产精品久久久久久久久久 | 亚洲综合国产 | 精精国产xxxx视频在线 | 毛片一区 | 一区二区在线观看免费视频 | 成年男女免费视频网站 | 久久国产精品一区二区 | 激情久久av一区av二区av三区 | 亚洲午夜精品视频 | 日韩免费视频 | 国产精品一区一区三区 | 国产精品成人一区二区三区 | 久久精品视频一区二区 |