一、編譯的原理主要分為三個步驟:
1、分詞/詞法分析:這個步驟主要是將字串分解成有意義的**。
2、解析/語法分析:陣列巢狀形成結構樹。
3、**生成:將結構樹轉化為**的過程。
二、作用域
引擎主要進行搜尋查詢編譯等過程,分為左查詢lhs和右查詢rhs;
編譯器主要是進行**的生成,語法分析。
作用域主要是 確定訪問許可權,收集維護所有宣告的識別符號。
作用域的具體體現:
1、包含整個作用域,其中只有乙個識別符號:foo.
2、包含foo建立的作用域,其中包含三個識別符號,b ,a,bar
3、包含bar建立的作用域,只有乙個識別符號:c
三、欺騙詞法
欺騙詞法作用域會導致效能下降,典型的試eval,with
eval()可以在寫的**中用程式生成**並執行,好像**就寫在這個位置,這就是所謂的欺騙詞法。
全域性eval,可以動態執行**,申明或者改變變數,可以更改區域性變數,在嚴格模式下,eval相當於乙個運算子,可以使用別的來覆蓋;
eval 只有乙個引數,如果傳入的不是字串的話,它直接返回這個引數;如果是字串,那麼首先會進行編譯,如編譯失敗則爆出語法錯誤;編譯成功則執行**。
with可以引用特定物件中已有的屬性,不能給物件新增屬性,如果給物件建立新的屬性,必須明確的引用該物件。
四、作用域中let和const的區別
let將變數繫結到所在的任意作用域中(通常是{}內部);
const主要是用來建立固定值的作用域變數;
五、變數提公升機制
變數的提公升主要涉及到編譯器的編譯和執行兩部分,編譯器的編譯部分涉及到lhs和rhs兩部分。
過程就像變數和函式宣告從**出現的位置被移動到最上面,被提公升的順序是函式先被提公升,然後才是變數提公升。
你不知道的javascript(二)
1.詞法作用域 就是定義在詞法階段的作用域,作用域查詢會在找到第乙個匹配的識別符號時停止。在多層的巢狀作用域中可以定義同名的標識 符,這叫作 遮蔽效應 內部的識別符號 遮蔽 了外部的識別符號 拋開遮蔽效應,作用域查詢始終從 執行時所處的最內部作用域開始,逐級向外或者說向上進行,直到遇見第乙個匹配的識...
你不知道的JavaScript 筆記
作用域是什麼?作用域的兩種工作模式 詞法作用域和動態作用域 1.查詢 作用域查詢會在找到第乙個匹配識別符號停止 2.欺騙詞法 eval 修改作用域 with 建立新的作用域 後果 導致js引擎在靜態分析時停止優化,導致效能下降 遵循最小授權原則 1.隱藏內部實現 2.規避衝突 3.立即執行函式 ii...
你不知道的JavaScript 作用域(二)
詞法階段 詞法作用域是定義在詞法階段的作用域。欺騙詞法 欺騙詞法的兩個機制 1 eval function foo str,a var b 2 foo var b 3 1 結果是1,3function foo str foo var a 2 2 with var obj 單調乏味的重複 obj ob...