你不知道的JavaScript之理解作用域(1)

2021-08-21 04:25:00 字數 1050 閱讀 8141

理解作用域

對於語句 var a = 2;

編譯過程分兩步:一是完成變數的宣告,如果同一作用域下已經有了該宣告,編譯器會忽略;二是為js引擎的執行生成**;

編譯之後生成了可執行的**,接下來由引擎來執行;此時引擎會做兩件事情,一是lsh查詢,二是rsh查詢;

"l"和"r"分別指左和右,但是本質上lsh指的是對變數宣告的查詢或者說為2找了乙個容器,而rsh指的是對變數的值的查詢;

對於以下語句:

function foo(){

console.log(a);

想象引擎和作用域之間的對話,也許是這樣的:

引擎:作用域啊,我需要為foo進行rhs查詢(因為我要執行foo),你見過它嗎?

作用域:見過!編譯器那傢伙剛剛生命了它。是乙個函式,給你!

引擎:好的,我來執行一下它。

引擎:還有個事,我需要對a進行lhs查詢(因為我要把2給它),你見過嗎?

作用域:這個也見過,編譯器把他生明為foo的乙個引數了

引擎:ok,那現在我就把2給它。

引擎:我要為console進行rhs查詢(因為我要執行console),你見過嗎?

作用域:當然!console是乙個內建物件,給你!

引擎:多謝,我來找找這有沒有log()......找到了,是乙個函式,我來執行一下。

引擎:我還需要對a做乙個rhs查詢(因為要執行log(a)),我當初把2給了它,它現在有什麼變化嗎?

作用域:放心吧,它沒有動過,給你!

引擎:那我就把a的值傳進來啦!

然後這有乙個測試題,關於對lsh和rsh的理解:

function foo(a){

var b  = a;

return a+b;

var c = foo(2);

我的理解是這樣的:執行foo(2)會又一次rsh查詢,然後傳參時對a要進行一次lsh查詢,執行 b = a時要對a進行一次rsh查詢,然後對b進行一次lsh查詢,執行return a+b時要對a和b分別進行一次rsh查詢,最後將返回值賦值給c,這要進行一次lsh查詢,所以這段**一共有三次lsh查詢和四次rsh查詢 。

你不知道的javascript(二)

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

你不知道的JavaScript (上)

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

你不知道的JavaScript 筆記

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