网上关于闭包的解释有很多,大多都过于概念化,定义很精准也很难看懂在说什么。。首先贴一道经典的闭包题:`
function a(){
var b=0
return function(){
console.log(b++)
}
}
var c=a()
var d=a()
c() //0
c() //1
d() //0
`
理解闭包之前,我们要明确 js 垃圾回收机制中关于引用次数的判断,即当引用对象的引用计数为 0 的时候,表明此对象值可回收。一个参数的作用域,即其是否能被调用,在于其调用时是否被回收,被回收了自然不能被调用。以上代码,当执行 var c=a() 时,可以理解为方法 a 开辟了一个新的内存空间 area1,area1 中定义的变量 b,由于返回的 function 中引用了变量 area1.b( 为了方便理解,以此表示 area1 空间中的 b 变量),因此 area1.b 的引用次数为 1,即垃圾回收机制不会对 area1.b 进行回收,后续执行 c() 时依然可以调用 area1.b 同理,var d=a(),此时开辟新的内存空间 area2, 并在其中定义变量 b。因此上述代码可以理解为:`
function a(){
var b=0
return function(){
console.log(b++)
}
}
var c=a()
var d=a()
c() // 执行 console.log(area1.b++), 输出 0
c() // 执行 console.log(area1.b++), 输出 1
d() // 执行 console.log(area2.b++), 输出 0
`