---
# System prepended metadata

title: Lambda函式 閉包與捕獲
tags: [程式]

---

### closure閉包(特性/現象)
使lambda函式中可以存取使用外部的變數，並保持引用。

### capture捕獲(行為)
執行到該lambda函式建立時，會把其中使用到的外部變數，
以值捕獲(capture by value)或引用捕獲(capture by reference)的方式，
保存至該lambda函式的閉包環境中，供該函式執行時存取。

### 語言差異
不同語言在closure與capture的行為上可能有所不同，如：c++, swift就需要明確指示要捕獲哪些外部變數，c#, javascript, lua, python則是隱含以引用捕獲，而python需要注意指定作用域nonlocal，少數像gdscript比較特別是隱含捕獲但引用類變數(dictionary, array)是引用捕獲，值類型則是值捕獲。

### 可能的問題
而引用捕獲也有可能造成一些問題例如：
1. 沒有釋放引用計數導致佔用記憶體
2. 強引用循環：
    應可被簡單解釋為，兩個變數互相引用，可獨立生存而不受到環境或區段結束或失去其他計數而被回收，導致持續存在的狀況。