秒懂!JavaSript 執行環境與堆疊

「獻給 JS 新手的五門底層運作課」系列文章之二

Coding Monster
魔鬼藏在程式細節裡
4 min readSep 1, 2018

--

Photo by Johnson Wang on Unsplash

執行環境 (Execution context)

前言

所有程式碼都必須在執行環境 (Execution context)中執行,你可以把 執行環境 想像成一間又一間的工作室,而每間工作室都會配有一個 執行環境物件,負責紀錄該環境中需要用到的各種資料,這個傢伙比較複雜,我們下一章節才會聊到它。

當你的程式碼已經準備好開始運行,第一個建立的執行環境就是:

全域執行環境 (Global execution context),又稱為 默認執行環境

執行環境 在建立時,會經歷兩個階段,分別是 :

  1. Creation Phase 創造階段
  2. 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)」的方式讓我知道你對這篇文章的喜愛!
也歡迎路過的大神們能給予技術方面的建議,謝謝你們的觀看。

--

--