語彙環境、作用域鍊、範疇、執行環境
一、語彙環境(Lexical Environment)
概念:
語彙環境指的是 變數與其值的對應集合,也就是你在某個範圍內宣告的變數,這些變數會被記錄起來、管理與查找的機制。
結構:
每個語彙環境由兩個部分組成:
-
環境紀錄器(Environment Record):用來實際儲存變數名稱與對應值的資料結構。
-
外部參照(Outer Lexical Environment Reference):指向它的「外層語彙環境」,讓 JS 引擎可以從內往外查找變數(形成作用域鍊)。
二、作用域鍊(Scope Chain)
概念:
當你要存取一個變數時,JS 會從目前所在的語彙環境開始,一層一層往外找,直到找到為止。這整條搜尋路徑就叫作作用域鍊。
關聯:
-
每個語彙環境都有一個「外部參照」,多個語彙環境就會串起來,變成一條鍊。
-
Lexical Environment + Outer Reference = Scope Chain 的基礎。
範例:
function outer() {
let a = 10;
function inner() {
console.log(a); // inner 函式的作用域鍊會找到 outer 的語彙環境
}
inner();
}
outer();
三、範疇(Scope)
概念:
範疇就是變數能夠被存取的範圍。這個範圍根據語法結構來決定,也就是你在哪裡宣告變數,就決定了它的作用範圍。
分類(以 JS 為例):
-
全域範疇(Global Scope):程式最外層的範圍。
-
區塊範疇(Block Scope):
let
、const
有的範疇(例如:if
,for
,{}
中)。 -
函式範疇(Function Scope):
var
的作用範圍被限制在函式內。
舉例:
let x = 1; // 全域範疇
function test() {
let y = 2; // 函式範疇
if (true) {
let z = 3; // 區塊範疇
}
}
四、執行環境(Execution Context)
概念:
每當 JS 開始執行一段程式碼(例如呼叫一個函式),就會建立一個執行環境,裡面會包含:
-
變數環境(Variable Environment)
-
語彙環境(Lexical Environment)
-
this 值
-
作用域鍊
分類:
-
全域執行環境(Global Execution Context):整個程式跑起來的初始環境。
-
函式執行環境(Function Execution Context):函式被呼叫時建立。
-
Eval 執行環境(Eval Execution Context):執行
eval()
時會建立(比較少用)。
總結(比喻說法)
你可以把這四個東西想成一個「辦公室內部管理系統」:
-
範疇(Scope) → 是「辦公室的空間」,限制每個員工(變數)在哪裡可以走動。
-
語彙環境(Lexical Environment) → 是「辦公室內的通訊錄」,記錄所有在這個空間工作的員工。
-
作用域鍊(Scope Chain) → 是「通訊錄往上層請示的順序」,找不到這個人就去上層部門找。
-
執行環境(Execution Context) → 是「當前你在哪個部門工作」,你所有的操作會在這裡進行,包括存取通訊錄、往外部門請示、決定
this
。