JavaScript代碼執行原理

JavaScript代碼是如何被機器理解並執行的呢?作爲 JavaScript 開發者,通常我們不需要關心JavaScript引擎是如何執行代碼的。但是,瞭解 JavaScript 引擎的工作原理,知曉它如何處理我們編寫的 JS 代碼、肯定是有益的。注意:這篇文章講述的原理,基於 Node.js 和 Chromium 的瀏覽器所使用的 V8 引擎。HTML 解析器遇到script標籤時,會從網絡、緩存中以字節流的方式加載代碼。此階段,字節流解碼器會負責將字節轉爲代碼字符。例如,字節流中的 0066 解碼爲 f,0075 解碼爲 u,006e 解碼爲 n,0063 解碼爲 c,0074 解碼爲 t,0069 解碼爲 i,006f 解碼爲 o,006e 解碼爲 n。結合起來便是: function! JavaScript 中的一個函數關鍵字,這時會將它做爲JavaScript代碼,並創建一個標記併發送給JS引擎。JS引擎使用兩個解析器:預解析器和解析器。爲了減少加載網頁所需的時間,引擎會盡量避免立即解析不必要的代碼。預解析器處理可能稍後會使用的代碼,而解析器則處理立即需要的代碼!如果某個函數只有在用戶點擊按鈕後纔會被調用,那麼不必要立即編譯這段代。如果用戶最終點擊了按鈕並需要那段代碼,它纔會被髮送到解析器。解析器根據從字節流解碼器接收到的代碼創建節點:創建一個抽象語法樹(AST)。接下來,輪到解釋器了!解釋器遍歷 AST,並根據 AST 包含的信息生成字節碼。一旦字節碼完全生成,AST 就會被刪除,從而釋放內存空間。字節碼已經是機器可以識別和處理的東西!字節碼速度很快。但還可以更快。當字節碼運行時,它可以檢測某些行爲是否經常發生,比如你多次調用一個函數:這時便可優化它,讓它運行得更快:字節碼與行爲反饋數據一起被髮送到優化編譯器。優化編譯器接從這些信息中生成高度優化過的字節碼:機器碼。總結而言,JS代碼變爲機器可識別的整個過程是:字節流 → JavaScript代碼 → 抽象語法樹(AST) → 字節碼 → 機器碼。