JavaScript引擎是執行JavaScript程式碼的電腦程式,這涉及到很多步驟,每個瀏覽器都有自己的JavaScript引擎,其中較知名的像是Google的V8引擎。
任何的JavaScript引擎都包含call stack和heap,call stack是程式碼實際執行的地方,而heap是非結構化的儲存池,儲存應用程式所需的所有物件。
當一段JavaScript程式碼進入引擎時,第一步是先解析這些程式碼,程式碼會被解析成一個數據結構,稱為AST(Abstract Syntax Tree),先將程式碼拆分成對語言有意義的片段,像是const或function等關鍵字,然後將這些片段以結構化的方式儲存到AST中,並檢查是否有語法錯誤,而生成的AST之後會用於生成machine code。
題外話,AST和DOM tree並無任何關聯,它就只是引擎中所有程式碼的代表而已。
下一步進入到編譯,AST會被編譯成machine code,我們在昨天的文章中有提到現代JavaScript引擎使用的是即時編譯,因此machine code不會變成可移植的文件,而是會被立即執行,執行這個部分就是發生在call stack當中。
現代JavaScript引擎的優化策略是在一開始先做出尚未被優化的machine code版本,然後盡快的執行它,在執行期間,引擎會在後台將這些程式碼再不斷的優化及重新編譯,並取代較未優化的程式碼,就是這個過程讓現代JavaScript引擎的效能變得如此快速。
這些解析、編譯和優化的過程都發生在引擎內部運作裡,和call stack中主要運作的程式碼是完全分隔開來的。