0%

JS核心(1)-執行環境與作用域-JavaScript 運作方式

前言

了解 JavaScript 的運作模式

我們寫的原始碼是無法直接被電腦或是瀏覽器閱讀的,在被電腦運行之前需經過 轉譯器 將相關的指令轉換成電腦能懂的指令。

JavaScript 是一種直譯式語言

什麼是直譯式語言(Interperted language)?

動態將程式碼透過直譯器逐句編譯為機器碼(直接生成電腦看得懂的代碼),之後再執行,以JavaScript來說,錯誤訊息都是會直接反映在瀏覽器的console上面。

直譯式語言


編譯式語言

什麼是編譯式語言(Compiled language)?

程式在撰寫的同時就 已被預先編譯 成機器碼,可以直接執行,
不用像直譯式語言還要多一道直譯程式。

編譯式語言


兩者的差異

  • 直譯式語言:
    優點:彈性高、修改、除錯方便。
    缺點:效率較低、不適合及時運用。

  • 編譯式語言:
    優點:執行速度快。
    缺點:開發速度、除錯速度較慢。


JavaScript直譯器轉換的過程

直譯器轉換的過程

可以使用 Esprima 的小工具來了解何謂語法基本單位化及抽象結構樹

首先我們可以先在 Esprima 輸入以下程式碼

var ming = '小明';  

透過旁邊的 Token 分頁標籤我們可以看到程式碼都被分析成一個一個類似物件的結構,而這就是所謂的語法基本單位化(Tokenizing)

Tokenizing

會看到 type 會有這些選項

  • Keyword (關鍵字)
  • Identifier (標識符,又稱為識別碼)
  • Punctuator (符號)
  • String、Number (型別)

在這邊要注意,在語法基本單位化時,他還不知道 ming 是一個變數名稱,他只是先將字詞解析為一個identifier。而等號和分號都被解析為punctuator標點符號而已。


抽象結構樹會將前一階段解析出來的tokens轉換為他們原本被賦予的意義。我們可以看到在tree這個tab裡,他已經成功將這段程式碼解讀為一個結構樹:宣告一個變數ming, 且初始值為小明

抽象結構樹

透過這過程我們可以了解到 JavaScript 的直譯器,是在 Tree 的階段才開始正式的了解每一個字詞的意義,但是這邊 JavaScript 並還沒有開始真正的執行,只是了解他的字詞而已,真正的執行是在代碼生成的時候,但每一個執行環境的不同,所以執行的結果就會跟著不同。