JavsScripe是一套非同步的、單執行緒(single-threaded)語言,任務與任務之間必須「排隊」執行。為了避免任務塞車禍無限循環,設計者給出了呼叫堆疊(call stack)、事件循環(event loop)、回調儲列(callback queue)與API等特性。
為了避免任務塞車、拖累效率等問題,JavsScripe將待命中的任務分為Sync與Async兩大類。首先,須先了解Event loop的結構。
(示意圖)
深入了解,可參考影片Stack and Queue。
JavsScripe本質為Sync,一次只能做一件事,使用的資料結構為 stack 堆疊(後進後出)。
如果用函式讓他一直循環,到最後記憶體會滿出來,出現Ranger Error,稱做stack overflow。這與無窮迴圈不太一樣,無窮迴圈只會卡住,不會出現錯誤訊息。
非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