Skip to content

Instantly share code, notes, and snippets.

@ywwwtseng
Last active April 19, 2025 15:53
Show Gist options
  • Save ywwwtseng/1dce83e2b3af08d9cd025697c7685648 to your computer and use it in GitHub Desktop.
Save ywwwtseng/1dce83e2b3af08d9cd025697c7685648 to your computer and use it in GitHub Desktop.

🧠 JavaScript 記憶體管理基礎:Stack vs Heap

JavaScript 引擎執行時,會使用兩種記憶體空間:

區域 說明 舉例
🧱 Stack(堆疊) 用來儲存函數的執行上下文(Execution Context)與區域變數(primitive) 呼叫函數時進入 call stack、執行完就退出
🗃 Heap(堆) 儲存物件、函數等參照型資料(reference types) 像是閉包、物件、陣列、函數本體

📌 補充說明

  • Stack 特性:先進後出(LIFO),執行效率高,空間有限。
  • Heap 特性:空間大但管理成本較高,由垃圾回收機制(GC)自動管理。
  • GC 的工作:當某個變數不再被參考時,JavaScript 引擎會自動回收其佔用的記憶體。

🔁 閉包(Closure)是什麼?

閉包是 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment