《你不知道的JavaScript》 作用域提公升

2021-09-09 05:55:38 字數 1319 閱讀 4470

前兩篇主要講作用域的查詢機制和常見形式,本篇要講的是作用域中的宣告提公升。

在全域性作用域和區域性作用域中,都存在宣告提公升的行為。

所謂宣告,包括變數宣告和函式宣告。而宣告提公升,就是在作用域範圍內,不管內部的變數與函式宣告在何處,當執行到這個作用域時,引擎都會首先將當前作用域內的變數和函式宣告放置到當前作用域頂端後,再按從上到下順序執行其他**。舉例:

a =2

;var a;

console.

log(a)

;// 輸出=> 2

console.

log(b)

;// 輸出=> undefined

var b =

2;

經過變數提公升後,實際為:

var a;

//將變數a宣告提公升到所在作用域頂端

a =2

;console.

log(a)

;// 2

var b;

//將變數b宣告提公升到所在作用域頂端

console.

log(b)

;// undefined

b =2

;

這裡注意有個坑了:函式宣告有提公升行為,函式表示式不會有提公升行為。

foo()

;// 輸出=> 1

function

foo()fn

();//輸出typeerror

bar();

// 輸出referenceerror

varfn

=function

bar(

)

問個問題:為什麼fn()呼叫會報typeerror錯誤呢? 因為此時的fn值為undefined,而對undefined呼叫方法,就會報typeerror錯誤。而使用為函式表示式新增的名稱識別符號bar進行方法呼叫時,輸出的則是referenceerror另外還有個細節需要注意,在同時有變數宣告和函式宣告的提公升行為中,引擎會執行函式優先的準則。即先提公升函式,再提公升變數。這再次證明果然js中函式是一等公民的地位。

最後總結下,js中的提公升行為,面向的是物件是變數宣告和函式宣告,排除了包括函式表示式的賦值在內的賦值操作並不會提公升。並且函式宣告的優先順序高於變數宣告。

你不知道的javascript(二)

1.詞法作用域 就是定義在詞法階段的作用域,作用域查詢會在找到第乙個匹配的識別符號時停止。在多層的巢狀作用域中可以定義同名的標識 符,這叫作 遮蔽效應 內部的識別符號 遮蔽 了外部的識別符號 拋開遮蔽效應,作用域查詢始終從 執行時所處的最內部作用域開始,逐級向外或者說向上進行,直到遇見第乙個匹配的識...

你不知道的JavaScript (上)

一 編譯的原理主要分為三個步驟 1 分詞 詞法分析 這個步驟主要是將字串分解成有意義的 2 解析 語法分析 陣列巢狀形成結構樹。3 生成 將結構樹轉化為 的過程。二 作用域 引擎主要進行搜尋查詢編譯等過程,分為左查詢lhs和右查詢rhs 編譯器主要是進行 的生成,語法分析。作用域主要是 確定訪問許可...

你不知道的JavaScript 筆記

作用域是什麼?作用域的兩種工作模式 詞法作用域和動態作用域 1.查詢 作用域查詢會在找到第乙個匹配識別符號停止 2.欺騙詞法 eval 修改作用域 with 建立新的作用域 後果 導致js引擎在靜態分析時停止優化,導致效能下降 遵循最小授權原則 1.隱藏內部實現 2.規避衝突 3.立即執行函式 ii...