国外的很多教材上定义:闭包除了被引用的的变量外,还包括了函数体,也就是说,闭包和函数对象是同一个概念。②
(这些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的闭包。
注:A⁼应当写成A的上画线,因为头条不支持,所有用A⁼代替。
如果,将JS的函数体看成这里的集合A,将JS函数体所有引用变量的全体看成导集A’,则JS函数体可看成这里的闭包A⁼。
可见JS函数体的定义②和数学上闭包的定义非常相似,所以才将JS函数体叫做闭包的。
当然,相对来说定义②比定义①,更符合数学。