這是一張簡單的JavaScript運行圖(若有錯誤地方請指出,謝謝你們)。大體分爲兩個階段,編譯階段和執行階段。在上一篇文章【JavaScript變量提高運行機制】中有簡單提到過。這篇文章帶你們來了解其中的一些概念。javascript
這個過程是將由字符組成的字符串分解爲有意義的代碼塊,這些代碼塊咱們稱之爲詞法單元(token)。例如:var num = 1;在當前階段會被分解爲var、num、=、一、空格,每個都是一個詞法單元,固然空格是不是一個有效的詞法單元取決於空格是否在JavaScript是否有意義。css
這個過程主要是將詞法單元流(數組)轉換爲一個由元素嵌套的程序語法樹(抽象語法樹,AST)。html
這個階段主要是將AST轉換爲可執行代碼。這個階段會進行變量的提高。java
引入幾個簡單的概念:數組
引擎:負責整個JavaScript的編譯和執行過程。編譯器:負責JavaScript的語法分析和代碼生成。做用域:負責收集並維護全部申明的標識符組成的一系列查詢,並實施一套規則,肯定當前執行的代碼對這些標識符的訪問權限。複製代碼
JavaScript並非簡單的一行行解釋執行,而是將JavaScript代碼分爲一塊塊的可執行代碼塊進行執行,JavaScript中主要主要分爲三類可執行代碼。
瀏覽器
上圖描述了JavaScript的執行過程,具體過程咱們先不看。一個JS引擎主要有一下幾部分組成。bash
內存堆(emory Heap):分配內存地址
app
調用棧(Call Stack):代碼執行ide
let name = '蝸牛';
function sayName(name) {
sayNameStart(name);
}
function sayNameStart(name) {
sayNameEnd(name);
}
function sayNameEnd(name) {
console.log(name);
}複製代碼
當代碼進行聲明時函數
執行sayName函數時,會把直接函數壓如執行棧,而且會建立執行上下文
JavaScript中每個可執行代碼,在解釋執行前,都會建立一個可執行上下文。按照可執行代碼塊可分爲三種可執行上下文
一、普通函數的調用:this指向window(瀏覽器環境)
二、對象方法的調用:this指向調用對象
三、構造函數:this指向構造函數實例
四、apply、call、bind:this指向綁定值
五、箭頭函數this:this指向外層第一個普通函數調用的this複製代碼
詞法環境自己包括兩個部分:
對於『環境記錄器』而言,它又分爲兩個主要的環境記錄器類型:
經過這個文章咱們能夠簡單的瞭解相關的JavaScript代碼執行機制。