【讀書筆記】《你不知道的 JavaScript(上卷)》筆記
阿新 • • 發佈:2022-05-12
第一部分 作用域和閉包
1.1 作用域是什麼?
作用域是一套規則,用於確定在何處以及如何查詢變數(識別符號)。如果查詢的目的是對變數進行賦值,那麼就會使用 LHS 查詢;如果目的是獲取變數的值,就會使用 RHS 查詢。賦值操作符會導致 LHS 查詢。=操作符或呼叫函式時傳入引數的操作都會導致關聯作用域的賦值操作。
JavaScript 引擎首先會在程式碼執行前對其進行編譯(詞法分析->語法分析->程式碼生成),在這個過程中,像var a = 2
這樣的宣告會被分解成兩個獨立的步驟:
- 首先,
var a
在其作用域中宣告新變數。這會在最開始的階段,也就是程式碼執行前進行。 - 接下來,
a = 2
LHS 和 RHS 查詢都會在當前執行作用域中開始,如果有需要(也就是說他們沒有找到所需的識別符號),就會向上級作用域繼續查詢識別符號,這樣每次上升一級作用域,最後抵達全域性作用域,無論找到或沒找到都將會停止。
不成功的 RHS 引用會導致丟擲 ReferenceError 異常。不成功的 LHS 引用會導致自動隱式地建立一個全域性變數(非嚴格模式下),該變數使用 LHS 引用的目標作為識別符號,或者丟擲 ReferenceError 異常(嚴格模式下)。