閉包(Closure)是 JavaScript 中的一個重要概念,它允許函數在其定義的詞法作用域(lexical scope)之外訪問變數。
簡單來說,閉包是指一個函數「記住」了它所定義時的環境,即使這個函數在該環境之外執行,它仍然可以訪問並操作那些環境中的變數。
了解閉包的關鍵點:
1.詞法作用域:在 JavaScript 中,函數內部可以訪問其定義時所在作用域中的變數。這叫做詞法作用域。
2.閉包形成:當一個函數被定義在另一個函數內部時,內部的函數可以訪問外部函數的變數,即使外部函數已經執行完畢並返回了。
3.持久的變數狀態:閉包允許函數「記住」並持續訪問它定義時的環境中的變數,即使這些變數不再在其他地方可見。
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function outerFunction() { let count = 0;
function innerFunction() { count += 1; console.log(count); }
return innerFunction; }
const myCounter = outerFunction();
myCounter(); myCounter(); myCounter();
|
分析:
.outerFunction 定義了一個名為 count 的變數,並返回了一個 innerFunction。
.innerFunction 是閉包,因為它記住了 outerFunction 的環境,能夠訪問 count 變數。
.每次調用 myCounter() 時,它都能訪問並修改 count 的值,儘管 outerFunction 已經執行完畢。
閉包的用途:
.數據封裝:閉包可以用來封裝數據,使其只在特定函數中可見,從而實現私有變數。
.函數工廠:可以用來創建一組與某些數據關聯的函數。
.回調和異步操作:閉包經常用於異步操作中,以便在操作完成後仍然能夠訪問必要的上下文數據。
閉包是 JavaScript 的一個強大特性,能夠實現更靈活和模組化的程式設計。