你不知道的 Javascript(筆記一)

weixin_33850890發表於2016-09-11

變數住在哪裡?換句話說,它們儲存在哪裡?最重要的是,程式需要時如何找到它們?
這些問題說明需要一套設計良好的規則來儲存變數,並且之後可以方便地找到這些變數。
這套規則被稱為作用域。

在傳統編譯語言的流程中,程式中的一段原始碼在執行之前會經歷三個步驟,統稱為“編譯”。

  • 分詞/詞法分析(Tokenizing/Lexing)

這個過程會將由字元組成的字串分解成(對程式語言來說)有意義的程式碼塊,這些代
碼塊被稱為詞法單元(token)。例如,考慮程式 var a = 2; 。這段程式通常會被分解成
為下面這些詞法單元: var 、 a 、 = 、 2、; 。空格是否會被當作詞法單元,取決於空格在這門語言中是否具有意義。

  • 解析/語法分析(Parsing)

這個過程是將詞法單元流(陣列)轉換成一個由元素逐級巢狀所組成的代表了程式語法
結構的樹。這個樹被稱為“抽象語法樹”(Abstract Syntax Tree,AST)。
var a = 2; 的抽象語法樹中可能會有一個叫作 VariableDeclaration 的頂級節點,接下
來是一個叫作 Identifier (它的值是 a )的子節點,以及一個叫作 AssignmentExpression 的子節點。 AssignmentExpression 節點有一個叫作 NumericLiteral (它的值是 2 )的子節點。

  • 程式碼生成

將 AST 轉換為可執行程式碼的過程稱被稱為程式碼生成。這個過程與語言、目標平臺等息
息相關。拋開具體細節,簡單來說就是有某種方法可以將 var a = 2; 的 AST 轉化為一組機器指令,用來建立一個叫作 a 的變數(包括分配記憶體等),並將一個值儲存在 a 中。

對於 JavaScript 來說,大部分情況下編譯發生在程式碼執行前的幾微秒(甚至更短!)的時間內。簡單地說,任何 JavaScript 程式碼片段在執行前都要進行編譯(通常就在執行前)。因此,JavaScript 編譯器首先會對 var a = 2; 這段程式進行編譯,然後做好執行它的準備,並且通常馬上就會執行它。

相關文章