你不知道的JavaScript學習筆記1——作用域
處理程序三要素:
引擎:編譯與執行過程。
編譯器:語法分析與代碼生成等。
作用域:收集並維護由所有聲明的標識符(變量)組成的一系列查詢,並實施一套非常嚴格的規則,確定當前執行的代碼對這些標識符的訪問權限。
示例:
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——作用域