JavaScript是屬於「Single Thread」的程式語言,同時程式碼會將函式「Stack」之後,進行逐條編碼的執行,又稱為「Call Stack」。
Call Stack:
function multiply(a, b) { return a * b } function square(n) { return multiply(n ,n) } function printSquare(n) { var square = square(n) console.log(squared) } printSquare(4)
source:CallStack.replit
執行「function」呼叫的時候,會依序將函式層層堆疊,同時單一段落程式碼完成後即消失,詳如下圖:
Infinite Loop:
呼叫執行函式,再回傳的時候仍執行原函式,導致無法停止執行,也就是無窮迴圈的窘境。
function foo() { return foo() } foo()
source:Infinite Loop.replit
Blocking:
當執行程式碼時發生等待很長一段時間沒有反應,或是多個請求同時進行,導致排擠而無法渲染畫面,稱之為「阻塞」。
var foo = $.getSync('//foo.com') var bar = $.getSync('//bar.com') var qux = $.getSync('//qux.com') console.log(foo) console.log(bar) console.log(qux)
source:Blocking.replit
Async Callback:
這是「Event loop」在同步執行上會發揮作用的部分。我們運用「setTimeout」呼叫堆疊的方式,來模擬非同步的請求。
console.log('h1') setTimeout(function() { console.log('there') }, 5000) console.log('JSConfEU')
source:Async Callback.replit
Event loop:
事件循環的功能就像是查看堆疊中的任務,如果堆疊是空的,他就會將第一個事件放到佇列上,並將接下來的事件往上疊加,讓堆疊能有效的執行。
專有名詞:
Single Thread(單執行緒):一次執行一段程式碼。
Call Stack(呼叫堆疊):依函式中層層的呼叫,並依序由下往上排序,類似「先進後出」的概念。
Async Callback(非同步呼叫堆疊):先執行Context,在處理「event queue」。
source:Philip Roberts 在 JS Conf 的演講影片