维基百科的闭包(计算机科学)这一词条对闭包的解释:
稍微有些晦涩难懂,重点在于当捕捉闭包的时候,它的自由变量会在捕捉时候被确定。在 JavaScript 中,这句话意味着闭包引用的变量不会在外层函数调用结束后被垃圾回收掉。
来看一个简单的闭包示例:
function a() {
let i = 0;
function b() {
console.log(++i);
}
return b;
}
// c 引用了函数 a 中的函数 b ,而 b 又用到了变量 i
let c = a();
c();
示例中的这段代码创建了一个闭包,因为函数 a 中的函数 b 被函数 a 外部的变量 c 引用了,因此即便函数 a 的调用已经结束,仍旧能够使用变量 i 的值。重复调用 c() 的结果就可以打印出逐渐累加的 1、2、3、4、5······,证明变量 i 的值和函数 b 并没有在函数 a 调用结束后被销毁。
所以闭包就是一个函数内部的函数被外部所引用,就构成了一个闭包!
闭包有什么好处呢?首先是变量 i 的值能能通过函数 b 来进行访问与操作,保证了 i 的安全和私密,可以用来实现 JavaScript 中的私有属性和方法,同时也可以使得 i 能够一直维持在内存中。