你不知道的JavaScript學習筆記1 作用域

2021-09-07 13:11:39 字數 1304 閱讀 6144

處理程式三要素:

引擎:編譯與執行過程。

編譯器:語法分析與**生成等。

作用域:收集並維護由所有宣告的識別符號(變數)組成的一系列查詢,並實施一套非常嚴格的規則,確定當前執行的**對這些識別符號的訪問許可權。

示例:

var a=2;的解析過程:

1.編譯器 詢問 作用域 是否已經有該名稱的變數

是:忽略該宣告,繼續執行;

否:宣告乙個新變數,命名為a;

2.編譯器為引擎生成**

引擎執行首先詢問作用域,在當前作用域集合中是否存在乙個a的變數:

是:引擎會使用這個變數;

否:引擎繼續查詢該變數;

找到了:將2賦值給a。

沒找到:丟擲異常。

總結:

變數賦值執行兩個動作:

1.編譯器宣告乙個變數;

2.執行時引擎在此作用域中查詢(lhs查詢)該變數,能找到就賦值。

引擎查詢方式:

"l"和"r"分別**左側和右側。什麼東西的左側和右側?是乙個賦值操作的左側和右側。

當變數出現在賦值操作的左側時進行lhs查詢,出現在右側時執行rhs查詢。

lhs查詢:

1.賦值操作的目標是誰;

2.查詢的目的是對變數進行賦值(=操作符或呼叫函式時傳入引數的操作)。

rhs查詢:

1.誰是賦值操作的源頭;

2.查詢的目的是獲取變數的值。

報錯型別:

referenceerror異常:

1.嚴格模式下不成功的lhs(非嚴格模式下不成功的lhs會導致自動隱藏地建立乙個全域性變數並不會報異常);

2.不成功的rhs。

typeerror異常:

如果 rhs 查詢找到了乙個變數,但是你嘗試對這個變數的值進行不合理的操作,比如試圖對乙個非函式型別的值進行函式呼叫,或著引用 null 或 undefined 型別的值中的屬性,那麼引擎會丟擲另外一種型別的異常。

作用域巢狀規則:

引擎從當前的執行作用域開始查詢變數,如果找不到,就向上一級繼續查詢。

你不知道的javascript(二)

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

你不知道的JavaScript (上)

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

你不知道的JavaScript 筆記

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