首先,JS中的閉包(Closure)是指:函式在建立時,其 執行上下中被 函式體 所有引用的 所有變數的總體,閉包和函式體共同組成函式物件。①
國外的很多教材上定義:閉包 除了被 引用的的變數外,還包括了函式體,也就是說,閉包和函式物件是同一個概念。②
(這些JS定義,題主應該很熟悉,而且本問題的回答中,已經有網友詳細介紹過了,因此我就不做過多解釋了。)
閉包一詞來自於《點集拓撲學》(也叫《一般拓撲學》),相關概念如下:
對於非空集合 X 的某些子集組成的子集族 τ,如果滿足:
Ø, X ∈ τ;
我們稱 (X, τ) 為 拓撲結構, τ 中的子集 稱為 開集。
對於 X 的子集 N ⊆ X,以及 N 中一點 x ∈ N,如果存在 開集 U ∈ τ,使得:
x ∈ U ⊆ N
則稱,N 是 x 的鄰域,x 是 N 的內點,N 的所有內點稱為 N 的內部,記為 Nº。
對於 X 的子集 A ⊆ X,以及 X 中的一點 x ∈ X,如果 x 的任何一個 鄰域 N 都和 A\{x} 相交非空,即,N ∩ (A\{x}) = Ø,則稱 x 是 A 的一個 聚點(也叫 極限點)。A 的所有聚點,稱為 A 的導集,記為 A",並稱 A⁼ = A ∪ A" 為 A 的閉包。
如果,將 JS的函式體 看成 這裡的集合 A,將 JS函式體所有引用變數的全體 看成 導集 A",則 JS函式體 可看成 這裡的閉包 A⁼。
可見 JS函式體的定義② 和 數學上閉包的定義非常相似,所以 才將 JS函式體 叫做 閉包的。
當然,相對來說 定義② 比定義 ①,更符合數學。
首先,JS中的閉包(Closure)是指:函式在建立時,其 執行上下中被 函式體 所有引用的 所有變數的總體,閉包和函式體共同組成函式物件。①
國外的很多教材上定義:閉包 除了被 引用的的變數外,還包括了函式體,也就是說,閉包和函式物件是同一個概念。②
(這些JS定義,題主應該很熟悉,而且本問題的回答中,已經有網友詳細介紹過了,因此我就不做過多解釋了。)
閉包一詞來自於《點集拓撲學》(也叫《一般拓撲學》),相關概念如下:
對於非空集合 X 的某些子集組成的子集族 τ,如果滿足:
Ø, X ∈ τ;
對於任意多 Aᵢ ∈ τ, i ∈ I (I 是任意指標集),都有 ∪ Aᵢ ∈ τ ; 對於任意 A₁, A₂ ∈ τ,都有 A₁ ∩ A₂ ∈ τ ;我們稱 (X, τ) 為 拓撲結構, τ 中的子集 稱為 開集。
對於 X 的子集 N ⊆ X,以及 N 中一點 x ∈ N,如果存在 開集 U ∈ τ,使得:
x ∈ U ⊆ N
則稱,N 是 x 的鄰域,x 是 N 的內點,N 的所有內點稱為 N 的內部,記為 Nº。
對於 X 的子集 A ⊆ X,以及 X 中的一點 x ∈ X,如果 x 的任何一個 鄰域 N 都和 A\{x} 相交非空,即,N ∩ (A\{x}) = Ø,則稱 x 是 A 的一個 聚點(也叫 極限點)。A 的所有聚點,稱為 A 的導集,記為 A",並稱 A⁼ = A ∪ A" 為 A 的閉包。
如果,將 JS的函式體 看成 這裡的集合 A,將 JS函式體所有引用變數的全體 看成 導集 A",則 JS函式體 可看成 這裡的閉包 A⁼。
可見 JS函式體的定義② 和 數學上閉包的定義非常相似,所以 才將 JS函式體 叫做 閉包的。
當然,相對來說 定義② 比定義 ①,更符合數學。