iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

追憶JS年華系列 第 17

Day-17 同步、非同步與事件循環

  • 分享至 

  • xImage
  •  

JavsScripe是一套非同步的、單執行緒(single-threaded)語言,任務與任務之間必須「排隊」執行。為了避免任務塞車禍無限循環,設計者給出了呼叫堆疊(call stack)、事件循環(event loop)、回調儲列(callback queue)與API等特性。

為了避免任務塞車、拖累效率等問題,JavsScripe將待命中的任務分為Sync與Async兩大類。首先,須先了解Event loop的結構。

事件循環 Event Loop

https://ithelp.ithome.com.tw/upload/images/20211012/20141041KIWoAOJgm1.png
(示意圖)

JavsScripe引擎

  • 用來將我們寫的 code 轉成讓機器看得懂的語言。
  • JavsScripe本身會有一個,而 WebAPI 也會有一個,每個 WebAPI 的引擎不同,最有名的是 chrome 的 V8 引擎。

stack 堆疊

  • JavsScripe是單執行緒的程式,使用的資料結構為(後進後出)。
  • 有的函式如 setInterval、setTimeout 不是原本JavsScripe的引擎有的函式,執行時會先跑到JavsScripe的 stack 裡 ,接著馬上跑到 WebAPI 執行。
  • 再來會跑到 Callback Queue 裡排隊,等到 stack 的東西執行完再執行 Queue 裡的函式。
  • 其中有的函式會被歸類在 Microtask Queue 當中,他們有特權、是高等的 Queue,會比一般在 Queue 執行的 task 還更優先執行。

深入了解,可參考影片Stack and Queue

Sync 同步執行/單執行緒:

JavsScripe本質為Sync,一次只能做一件事,使用的資料結構為 stack 堆疊(後進後出)。

如果用函式讓他一直循環,到最後記憶體會滿出來,出現Ranger Error,稱做stack overflow。這與無窮迴圈不太一樣,無窮迴圈只會卡住,不會出現錯誤訊息。

Async 非同步執行

非JavsScripe內建語法如 setTimeout 的 callback 不會卡在 stack 區塊裡。

具體上,一開始會先在 stack 區塊出現,接著瞬間丟給 Runtime(執行環境:瀏覽器或node) 執行,等設定的時間過了之後,接著來到 Queue 排隊區(會按照順序排列),最後等 stack 區塊裡的程式碼跑完,setTimeout 的 callback 才會跑到 stack 區塊執行結果。例:

console.log (1)
console.log (2)
setTimeout ( () => {console.log(4);}, 3000)  //最快3秒後印出4
console.log (3) //最後印出 1, 2, 3, 4

上一篇
Day-16 回呼函式、高階函式與IIFE
下一篇
Day-18 閉包
系列文
追憶JS年華30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言