你不知道的JavaScript 作用域(二)

2021-08-17 19:09:48 字數 1308 閱讀 2348

詞法階段

詞法作用域是定義在詞法階段的作用域。

欺騙詞法:

欺騙詞法的兩個機制:

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...