JavaScript 引擎執行時,會使用兩種記憶體空間:
區域 | 說明 | 舉例 |
---|---|---|
🧱 Stack(堆疊) | 用來儲存函數的執行上下文(Execution Context)與區域變數(primitive) | 呼叫函數時進入 call stack、執行完就退出 |
🗃 Heap(堆) | 儲存物件、函數等參照型資料(reference types) | 像是閉包、物件、陣列、函數本體 |
- Stack 特性:先進後出(LIFO),執行效率高,空間有限。
- Heap 特性:空間大但管理成本較高,由垃圾回收機制(GC)自動管理。
- GC 的工作:當某個變數不再被參考時,JavaScript 引擎會自動回收其佔用的記憶體。
閉包是 JavaScript 中一種特殊的函數,它可以「記住」自己被創建時的作用域,即使在外部函數已經執行完畢之後。
閉包會讓外部函數中的變數保留在 Heap 中,不會被垃圾回收機制(GC)清除,因為它們仍然被內部函數所參照。
function outer() {
let count = 0; // count 儲存在 Heap 中,因為被 inner 函數使用
function inner() {
count++;
console.log(count);
}
return inner;
}
const counter = outer(); // outer 執行完畢,但 count 沒被釋放
counter(); // 1
counter(); // 2