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。