1. 程式人生 > >你不知道的JavaScript學習筆記1——作用域

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

模式 引用 語法分析 訪問 要素 並不會 參數 嵌套 ron

處理程序三要素:

引擎:編譯與執行過程。

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

作用域:收集並維護由所有聲明的標識符(變量)組成的一系列查詢,並實施一套非常嚴格的規則,確定當前執行的代碼對這些標識符的訪問權限。

示例:

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——作用域