第一部分 作用域和閉包
1.1 作用域是什麼?
作用域是一套規則,用於確定在何處以及如何查找變量(標識符)。如果查找的目的是對變量進行賦值,那麼就會使用 LHS 查詢;如果目的是獲取變量的值,就會使用 RHS 查詢。賦值操作符會導致 LHS 查詢。=操作符或調用函數時傳入參數的操作都會導致關聯作用域的賦值操作。
JavaScript 引擎首先會在代碼執行前對其進行編譯(詞法分析->語法分析->代碼生成),在這個過程中,像var a = 2
這樣的聲明會被分解成兩個獨立的步驟:
- 首先,
var a
在其作用域中聲明新變量。這會在最開始的階段,也就是代碼執行前進行。 - 接下來,
a = 2
會查詢(LHS 查詢)變量 a 並對其進行賦值。
LHS 和 RHS 查詢都會在當前執行作用域中開始,如果有需要(也就是說他們沒有找到所需的標識符),就會向上級作用域繼續查找標識符,這樣每次上升一級作用域,最後抵達全局作用域,無論找到或沒找到都將會停止。
不成功的 RHS 引用會導致拋出 ReferenceError 異常。不成功的 LHS 引用會導致自動隱式地創建一個全局變量(非嚴格模式下),該變量使用 LHS 引用的目標作爲標識符,或者拋出 ReferenceError 異常(嚴格模式下)。