iT邦幫忙

2021 iThome 鐵人賽

DAY 19
3

前情提要

上回偷拿遠距離初階魔法攻擊艾草。

艾草:「我看你拿魔法丟我丟得挺順的了(╬•᷅д•᷄╬),那開始教你中階魔法吧!」

「喔喔喔喔喔,被我扔到良心發現了嗎?」

艾草:「我們來玩達摩塔吧!」

「...???」

艾草:「規則是要由下往上疊後由上往下敲打。」

「怎麼這麼突然?」

艾草:「為了讓你對執行環境與堆疊有更深的體悟呀!」

「咦咦,那趕緊先教我吧!」

艾草:「喔,對了,這遊戲輸了可是有處罰的,這次的執行環境與執行堆疊,可要好好了解唷!」
https://ithelp.ithome.com.tw/upload/images/20211003/20139066KL5YRFFWfl.png
(艾草心裡 os 不曉得處罰輸家要被贏家當達摩塔敲解不解氣(`∀´)Ψ)


執行環境 Execution Context

今天讓我們來聊聊 JavaScript 的執行環境 Execution Context 吧!

什麽是執行環境呢?

執行環境 Execution Context

全域執行環境 Global Execution Context

JavaScript 在執行時會先建立全域執行環境 Global Execution Context ,而執行環境在網頁開始時就會被建立時,建立時會分別經歷兩個階段:

第一階段:創造階段 Creation Phase

  • 建立全域物件:window
  • 建立 this
  • 建立 Variable Object (VO) :hoisting 提升的原因

第二階段:執行階段 Execute Phase

在此階段會依造程式碼一行一行去執行。

除了全域執行環境 Global Execution Context 外,還有函式執行環境 Function Execution Context

函式執行環境 Function Execution Context

函式執行環境怎麼產生的呢?

全域環境在執行階段會一行一行去讀程式碼,當讀到函式時並不會立刻產生執行環境,在呼叫該函式時,才會產生該函式的執行環境

那全域執行環境不會跟函式執行環境打架嗎?這邊就要提到 JavaScript 是單執行緒

單執行緒簡單來說,就是 JavaScript 一次只會去做一件事情,那 JavaScript 到底怎麼幫我們分類要先做全域執行環境的程式碼還是函式執行環境的程式碼呢?


執行堆疊 Execution Stack

剛剛提到 JavaScript 是單執行緒一次只能做一件事,在做的事情就一定是有先後順序的,而先後順序要怎麼區分,就要來談談執行堆疊 Execution Stack 是什麼了!

你可以想像成每一個環境都是在蓋大樓,如圖:

  • 紅色箭頭代表這棟大樓怎麼蓋,會從底層開始慢慢往上蓋
  • 綠色箭頭代表我要怎麼去執行,會從最上方開始執行
  • 深灰色的地方則是每個執行環境

接著,讓我們來用程式碼舉個例子吧!

console.log("範例開始");
function one() {
  console.log("我是第一個被呼叫的函式");
  two();
	console.log("呼叫 two 後執行")
}
function two() {
  console.log("我是第二個被呼叫的函式"); 
}
one();
console.log("呼叫 one 後執行");

執行後結果:
https://ithelp.ithome.com.tw/upload/images/20211003/20139066btei6VM7tk.png

可以看到執行後的結果,當全域執行環境執行到呼叫函式 one 時,JavaScript 會先跑去執行函式 one ,而函式 one 執行到呼叫函式 two 時,JavaScript 又會先跑去執行並印出"我是第二個被呼叫的函式",等函式 two 、函式 one 執行後,才會繼續執行全域執行環境的 "呼叫 one 後執行"。

當執行到函式 two執行堆疊會長成下圖:

如圖,最底層一定會先建立一個全域執行環境,當我們在全域執行環境呼叫 function one () 時,就會產生 function one執行環境,在 function one 呼叫 two 時,也會將 two 的環境堆疊上去,而 JavaScript 會依照綠色箭頭的方向,由最上層一層一層往下執行!

如何透過瀏覽器查看執行堆疊

以下以 Chrome 瀏覽器示範:

步驟一、點選 Sources ,並於左側選單選取想查看的檔案

https://ithelp.ithome.com.tw/upload/images/20211003/20139066Tu2UuG7pBi.png

步驟二、點選想觀察的程式碼

https://ithelp.ithome.com.tw/upload/images/20211003/20139066KbInAtY29i.png

步驟三、刷新頁面並點選圖示按鈕

https://ithelp.ithome.com.tw/upload/images/20211003/20139066agkwCU1l0x.png

步驟四、向下逐行觀察顯示結果


總結

知識點:執行環境

  • 執行環境分為:全域執行環境、函式執行環境
  • 執行環境建立時分為創造階段、執行階段
  • 函式執行環境為呼叫該函式時才會產生
  • JavaScript 是單執行緒

知識點:執行堆疊

  • 最底層一定是全域執行環境
  • 執行環境會由底層往上層堆疊
  • 執行時會由最上層往底層執行

小練習

請參考以下程式碼,選出執行到註解處時,執行堆疊正確的選項

function a() {
  console.log("我是第一個被呼叫的函式");
  b();
}
function b() {
  console.log("我是第二個被呼叫的函式");
  c();
}
function c() {
  //當程式碼執行到此處時的執行堆疊為何
  console.log("我是第三個被呼叫的函式");
}
a();

(由左到右分別代表底層到上層)
A 全域執行環境 > function a > function b > function c
B function c > function b > function a > 全域執行環境
C function b > function a > 全域執行環境 > function c
D 全域執行環境 > function c > function b > function a

解答:選項 A 正確,執行堆疊由底層往上堆疊


參考文獻

JavaScript 核心篇(六角學院)
https://medium.com/魔鬼藏在程式細節裡/淺談-javascript-執行環境-2976b3eaf248
https://medium.com/itsems-frontend/javascript-execution-context-and-call-stack-e36e7f77152e
https://medium.com/unalai/開發必備-摸索不完的-chrome-devtools-小技巧之設置斷點篇-4d72cb35fa39


上一篇
入門魔法 - ES6 箭頭函式寫法
下一篇
中階魔法 - 範圍鍊 Scope Chain
系列文
JavaScript 魔法入門 - 從入門到中階觀念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
龜人
iT邦新手 3 級 ‧ 2021-10-03 20:53:17

Yes

艾草 iT邦新手 3 級 ‧ 2021-10-03 20:57:45 檢舉

物理攻擊魔法,讚 ୧〳 ^ ౪ ^ 〵୨

我要留言

立即登入留言