詞法階段
詞法作用域是定義在詞法階段的作用域。
欺騙詞法:
欺騙詞法的兩個機制:
1) eval(…)
function
foo(str,a)
var b = 2;
foo("var b = 3;",1)
//結果是1,3
function
foo(str)
foo("var a = 2;");
2)with
var
obj = ;
//單調乏味的重複"obj"
obj.a=2;
obj.b=3;
obj.c=4;
//簡單的快捷方式
with(obj)
但實際上這不僅僅是為了方便地訪問物件屬性。如:
function
foo(obj)
}var o1 = ;
var o2 = ;
//①foo(o1);
console.log(o1.a) //2
//②foo(o2);
console.log(o2.a); //undefined;
console.log(a); //2 a被洩露到全域性作用域上了!
效能 小結
詞法作用域意味著作用域是由書寫**時函式宣告的位置來決定的。
編譯的詞法分析階段基本能夠知道全部識別符號住**,如何宣告。
欺騙詞法作用域會導致新能下降,js引擎在編譯時對作用域進行優化,因為引擎只能謹慎地認為這樣的優化是無效的。任何乙個欺騙詞法機制都將導致**執行變慢。不要使用他們。
另乙個不推薦使用eval(…)和with的原因是會被嚴格模式所影響(限制)。with被完全禁止,在保留核心功能的前提下,間接或非安全地使用eval(…)也被禁止了。
在舊的瀏覽器中如果你使用了eval,效能會下降10倍。在現代瀏覽器中有兩種編譯模式:fast path和slow path。fast path是編譯那些穩定和可**(stable and predictable)的**。
它由2個能夠將源**直接轉換成計算機**的編譯器組成。
full-codegen:輸出非優化**的快速編譯器。
crankshaft:輸出快速,優化**的慢速編譯器。
如果crankshaft認為由full-codegen產生的不夠優化的**需要優化,它將會取而代之,這就是「crankshafting」流程。
你不知道的javascript(二)
1.詞法作用域 就是定義在詞法階段的作用域,作用域查詢會在找到第乙個匹配的識別符號時停止。在多層的巢狀作用域中可以定義同名的標識 符,這叫作 遮蔽效應 內部的識別符號 遮蔽 了外部的識別符號 拋開遮蔽效應,作用域查詢始終從 執行時所處的最內部作用域開始,逐級向外或者說向上進行,直到遇見第乙個匹配的識...
你不知道的JavaScript (上)
一 編譯的原理主要分為三個步驟 1 分詞 詞法分析 這個步驟主要是將字串分解成有意義的 2 解析 語法分析 陣列巢狀形成結構樹。3 生成 將結構樹轉化為 的過程。二 作用域 引擎主要進行搜尋查詢編譯等過程,分為左查詢lhs和右查詢rhs 編譯器主要是進行 的生成,語法分析。作用域主要是 確定訪問許可...
你不知道的JavaScript 筆記
作用域是什麼?作用域的兩種工作模式 詞法作用域和動態作用域 1.查詢 作用域查詢會在找到第乙個匹配識別符號停止 2.欺騙詞法 eval 修改作用域 with 建立新的作用域 後果 導致js引擎在靜態分析時停止優化,導致效能下降 遵循最小授權原則 1.隱藏內部實現 2.規避衝突 3.立即執行函式 ii...