閉包(Closure)是指函式和其相關的引用環境的組合。在 JavaScript 中,函式內部可以訪問其外部作用域中的變數和函式,當函式內部引用了外部作用域的變數時,就會形成閉包。
一個閉包實際上是由一個函式和在該函式建立時所處的詞法環境組成的。這意味著函式可以訪問定義時的外部作用域中的變數,即使在函式執行完成後,它仍然可以訪問到這些變數。
閉包的特點包括:
-
內部函式訪問外部函式作用域的變數:內部函式可以訪問外部函式中宣告的變數,即使外部函式已經執行完畢。
-
外部函式的變數在內部函式執行完畢後仍然可用:由於閉包會持有外部函式的作用域鏈,因此即使外部函式執行完畢,其作用域中的變數在內部函式中也是可用的。
閉包在 JavaScript 中有廣泛的應用,常見的用途包括:
- 封裝私有變數和方法:透過閉包可以建立私有作用域,從而實現封裝,防止變數被外部訪問和修改。
- 延遲執行:透過閉包可以將一些邏輯延遲到函式執行時才執行,例如事件處理函式。
- 模組化開發:透過閉包可以建立模組,將相關的函式和資料封裝在閉包中,從而提高程式碼的可維護性和可複用性。
需要注意的是,閉包可能會導致記憶體洩漏問題,因為閉包會持有外部函式作用域中的變數,如果不及時釋放這些引用,可能會導致記憶體佔用過高。因此在使用閉包時需要注意記憶體管理。
下面是一個簡單的 JavaScript 示例,演示了閉包的概念:
function outerFunction() {
var outerVariable = "I am from outer function";
function innerFunction() {
console.log(outerVariable); // 內部函式可以訪問外部函式中的變數
}
return innerFunction;
}
var innerFunc = outerFunction();
innerFunc(); // 輸出:I am from outer function
在這個例子中,outerFunction
是外部函式,它定義了一個名為 outerVariable
的變數,並返回了一個內部函式 innerFunction
。innerFunction
可以訪問 outerVariable
,即使在外部函式執行完畢後,依然可以訪問到這個變數。這是因為 innerFunction
形成了閉包,它持有了外部函式的作用域鏈。
當我們呼叫 innerFunc()
時,內部函式 innerFunction
被執行,它能夠訪問並輸出外部函式中的 outerVariable
變數的值。
這個例子展示了閉包的特性,內部函式持有外部函式的作用域鏈,可以訪問外部函式中的變數,即使外部函式已經執行完畢。