Skip to main content

Closure(閉包)

Closure(閉包),在程式語言中(像是 JavaScript、Python 甚至 Swift 等),指的是:

一個函式加上它所捕捉到的外部變數,形成的一個組合。

簡單來說:

  • 當一個函式在它定義時的作用範圍(scope)之外被呼叫,但它仍然記得當時周圍的變數時,就形成了 closure。

舉個 JavaScript 的簡單例子:

function outer() {
let count = 0;

function inner() {
count++;
console.log(count);
}

return inner;
}

const counter = outer(); // outer() 被執行,回傳 inner 函式
counter(); // 印出 1
counter(); // 印出 2
counter(); // 印出 3

這裡:

  • outer() 裡定義了一個變數 count 和一個內部函式 inner()。
  • outer() 呼叫完之後,理論上 count 這個變數應該消失,因為 outer() 已經結束了。
  • 但是,由於 inner() 被回傳出來,而且 inner() 引用了 count,所以 count 被「保留下來了」。
  • 每次呼叫 counter(),count 都還在,並且被累加。

這就是closure在運作!

重要的幾個點:

  • Closure 會「記住」當時的環境(變數、常數等)。
  • Closure 很常被用來實作 資料封裝記憶變數狀態、或是建立 工廠函式
  • 可能會導致記憶體無法釋放(因為變數被引用著),要小心避免不必要的 closure。