秒懂!JavaSript 執行環境與堆疊
「獻給 JS 新手的五門底層運作課」系列文章之二
執行環境 (Execution context)
前言
所有程式碼都必須在執行環境 (Execution context)
中執行,你可以把 執行環境
想像成一間又一間的工作室,而每間工作室都會配有一個 執行環境物件
,負責紀錄該環境中需要用到的各種資料,這個傢伙比較複雜,我們下一章節才會聊到它。
當你的程式碼已經準備好開始運行,第一個建立的執行環境就是:
全域執行環境 (Global execution context),又稱為
默認執行環境
。
執行環境
在建立時,會經歷兩個階段,分別是 :
- Creation Phase 創造階段
- Execution Phase 執行階段
一旦 全域執行環境
結束 創造階段
、進入 執行階段
,它就會開始由上到下、一行一行地執行程式,並自動跳過函式裡的程式碼,這其實蠻合理的,畢竟你只是進行函式宣告,並沒有打算當下執行它。
如果你的專案非常的陽春,完全沒有任何的函式呼叫 (Function Call)
,那麼全域執行環境
是你唯一會遇到的 執行環境
。
你可能會問,如果有
函式呼叫
呢?
一旦 全域執行環境
在執行程式碼的過程中,判讀到函式呼叫
,全域執行環境
就會馬上為它建立一個全新的執行環境
,專門供這個函式裏頭的程式碼運行,如果我們不斷地在一個函式中又呼叫另一個函式,可想而知,就會建立很多個執行環境
,而這些工作室會相互堆疊,變成一棟 工作大樓
。
有趣的是,執行環境
的堆疊過程是具有 順序性
的。越新也就是越晚被建立的 執行環境
,會被擺在工作大樓堆疊中的越高處,反之亦然,越早被建立 執行環境
則會被擺在越低處。
如此聰明的你們,回答我:
全域執行環境,會在堆疊中的哪一個位置呢?
答案是堆疊中的第一層!因為它是最早被建立的執行環境
。
而這些堆疊在一起的執行環境
,
我們稱之為執行堆疊 (Execution stack)
。
執行堆疊
JavaScript 是單執行緒
的,講白話一點:
「就是 JavaScript 一次只能專心做一件事情。」
那這跟我們今天要提的東西,有什麼關係呢?
一旦 執行環境
開始堆疊,基於 JavaScript 單執行緒
的特性,它只能一次處理一件事,那 JavaScript 會優先執行堆疊中的哪一個 執行環境
呢?
很簡單,它會優先處理 執行堆疊
中最頂端的 執行環境
,同時有人會稱這個正在執行中的環境為 現行環境 (Active context)
。
那 執行環境
什麼時候會被移除呢?答案是:一旦該函式執行完並且 返回 (return)
後,該 執行環境
就會自動從 執行堆疊
的最頂端消失。
緊接著 執行堆疊
中最上方的 執行環境
就會成為 現行環境 (Active context)
,以此類推⋯⋯直到所有的 執行環境
都完成任務、從堆疊中被移除。
本堂精華:1 分鐘課後複習
- 所有的程式碼都必須在
執行環境
中運行。 全域執行環境
是默認的第一個執行環境。- JavaScript 只有在
函式呼叫
發生時,才會建立新的執行環境。 - 執行環境相互堆疊後,會形成
執行堆疊
。 - 執行堆疊具有
順序性
,越新的執行環境會被擺在越高處,反之亦然。 - JavaScript 是
單執行緒
的程式語言,一次只能做一件事。 - JavaScript 會優先執行堆疊中
最頂端
的執行環境。 - 執行環境會在函式
return
之後,自動從堆疊中 pop off 消失。
Takeaway
暸解 JavaScript 執行程式背後的先後順序。
預告:執行環境物件與何謂提升 (Hoisting)
下一章節,我們會聊到什麼是執行環境中的物件、以及它的功能與背後的原理,是許多新手難以理解的觀念之一,我們將由淺入深,讓你能瞬間掌握這些抽象到不行、卻重要到不行的「JS 底層運作原理」。
如果這篇文章有幫助到你的話,是我最大的榮幸。
請用長按「拍手 (Clap)」的方式讓我知道你對這篇文章的喜愛!
也歡迎路過的大神們能給予技術方面的建議,謝謝你們的觀看。