深圳做律師網(wǎng)站公司搜索引擎優(yōu)化員簡歷
js 是解釋型語言
js 引擎執(zhí)行流程
分為兩個階段:
- 語法分析
- 執(zhí)行階段
執(zhí)行階段涉及的數(shù)據(jù)結(jié)構(gòu):
- 調(diào)用棧。處理執(zhí)行上下文和執(zhí)行代碼
- 內(nèi)存堆。給對象分配內(nèi)存
- 任務(wù)隊列。暫存待執(zhí)行的任務(wù),分為宏任務(wù)隊列和微任務(wù)隊列
語法分析
詞法分析 > 語法分析 > 代碼生成(字節(jié)碼)
執(zhí)行階段
代碼生成后 js 引擎會先創(chuàng)建執(zhí)行上下文(也叫預(yù)編譯),再逐塊(執(zhí)行上下文)逐行執(zhí)行代碼
執(zhí)行上下文
分類:
- 全局執(zhí)行上下文
- 函數(shù)執(zhí)行上下文
- eval 函數(shù)執(zhí)行上下文(下文暫不提及)
第一次讀取 js 腳本時會生成全局執(zhí)行上下文,有且只有一個,始終位于調(diào)用棧底部。當(dāng)函數(shù)被調(diào)用時,會創(chuàng)建一個函數(shù)執(zhí)行上下文并推入當(dāng)前棧頂,執(zhí)行完函數(shù)會出棧。棧頂是當(dāng)前活動的執(zhí)行上下文
每次創(chuàng)建執(zhí)行上下文主要有以下幾個步驟:
- 初始化作用域鏈
- 創(chuàng)建變量對象
- 創(chuàng)建 arguments 對象,檢查參數(shù)上下文,初始化名稱和值,并創(chuàng)建引用副本
- 掃描上下文中函數(shù)的聲明
- 對于找到的每個函數(shù),在變量對象中創(chuàng)建一個屬性,該屬性是確切的函數(shù)名,該函數(shù)在內(nèi)存中有一個指向該函數(shù)的引用指針
- 如果函數(shù)名已經(jīng)存在,指針將會被覆蓋
- 掃描變量的聲明
- 對于找到的每個變量,在變量對象中創(chuàng)建一個屬性,該屬性是確切的變量名,該變量的值是 undefined
- 如果變量名已經(jīng)存在,將不會做任何處理繼續(xù)執(zhí)行
- 確定 this 的指向
JavaScript 執(zhí)行上下文——JS 的幕后工作原理
變量、函數(shù)提升
函數(shù)和變量聲明提升是在創(chuàng)建變量中進(jìn)行的,舉個例子:
function foo(a) {console.log(b);console.log(foo2);console.