1. 程式人生 > >《你不知道的JavaScript》:作用域

《你不知道的JavaScript》:作用域

今天是2018年的最後一天,不管這一年當中有多少五味雜陳,統統都即將過去。

明天是新的一天,也是新的一年,預祝我自己,也預祝所有關注我公眾號的朋友,新年一切安康。

本篇開始,讀《你不知道的JavaScript》上中下三卷,並將讀後總結奉上。

今天讀上卷,第一部分作用域和閉包中的作用域。

作用域概念:

作用域指:一套設計良好的用來儲存變數、並且之後可以方便找到這些變數的規則。

說的更細緻點,作用域就是一套負責收集並維護所有宣告的識別符號(變數)組成的一系列查詢,並實施一套非常嚴格的規則,確定當前執行的程式碼對這些識別符號的訪問許可權。

作用域中查詢機制:

在作用域範圍內中,引擎會對變數執行LHS查詢和RHS查詢。這兩個查詢從字面意思上理解就是查詢賦值操作左側的變數和查詢賦值操作的右側。

意思大致對,但並不完全精準,正確的理解應是:查詢賦值操作的目標(LHS)和查詢賦值操作的源頭(RHS)

巢狀作用域的查詢路徑:

在實際開發過程中,作用域常常不是隻有一個,而是多個作用域巢狀的。即全域性作用域可能包含若干個父區域性作用域,一個父區域性作用域又可能會包含若干個子區域性作用域…如此下去。當然也不可能巢狀層級太多,太多就暈,看到會想殺人的…

那麼在存在巢狀作用域的情況下,某個變數的查詢規則又是什麼呢?很簡單,在當前作用域中無法找到該變數時,引擎就會自變數所處當前作用域逐級向上冒泡般的查詢,遵循就近原則,哪個作用域中最先查詢到該變數,返回相應值後這事就算結束。或者直到抵達全域性作用域也沒有時,則返回個undefined

就算了事。

總結下:

作用域是一套根據名稱查詢變數的規則,這套規則規定了在何處(巢狀層級)以及如何查詢變數(LHS or RHS)。

如果查詢的目的是對變數賦值,就會使用LHS查詢;如果查詢的目的是獲取變數的值,就會使用RHS查詢。

其中賦值操作符會導致RHS查詢:=操作符或呼叫函式時傳入引數的操作都會導致關聯作用域的賦值操作。

LHS和RHS查詢都會在當前作用域中開始,如果沒有在當前作用域找到所需的識別符號,就會逐級向上級作用域查詢目標識別符號,直到找到為止或者沒有找到時到全域性作用域為止。

喜歡本文請掃下方二維碼,關注微信公眾號: 前端小二,檢視更多我寫的文章哦,多謝支援。


在這裡插入圖片描述