2024-08-26 Javascript Closure 閉包

閉包(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 是 innerFunction 的一個引用

myCounter(); // 每次調用都會增加 count 的值
myCounter();
myCounter();

分析:

.outerFunction 定義了一個名為 count 的變數,並返回了一個 innerFunction。 .innerFunction 是閉包,因為它記住了 outerFunction 的環境,能夠訪問 count 變數。 .每次調用 myCounter() 時,它都能訪問並修改 count 的值,儘管 outerFunction 已經執行完畢。

閉包的用途:

.數據封裝:閉包可以用來封裝數據,使其只在特定函數中可見,從而實現私有變數。 .函數工廠:可以用來創建一組與某些數據關聯的函數。 .回調和異步操作:閉包經常用於異步操作中,以便在操作完成後仍然能夠訪問必要的上下文數據。 閉包是 JavaScript 的一個強大特性,能夠實現更靈活和模組化的程式設計。