网上关于闭包的解释有很多,大多都过于概念化,定义很精准也很难看懂在说什么。。首先贴一道经典的闭包题:function a(){var b=0return function(){ console.log(b++) }}var c=a()var d=a()c() //0c() //1d() //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=0return function(){ console.log(b++) }}var c=a()var d=a()c() //执行console.log(area1.b++),输出0c() //执行console.log(area1.b++),输出1d() //执行console.log(area2.b++),输出0