网上关于闭包的解释有很多,大多都过于概念化,定义很精准也很难看懂在说什么。。
首先贴一道经典的闭包题:
`
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
`