JS的闭包

JS闭包,闭包可以看做是父函数对象的公用方法,内部变量可以看做是父函数对象的私有属性。

function autoInc(init){
let x=init||0;
return{
inc:function(){
x+=1;
return x;
}
}
}
JavaScript作用域 

是”链式作用域”结构(chain scope)

autoInc函数对象返回值。

对于刚接触JavaScript的小伙伴,很容易发蒙,不知道autoInc的返回值是x,还是匿名函数。其实,autoInc函数对象的返回值是一个对象

{inc: function{…}} //这是JS特有的object类型

因此调用autoInc(8)的作用:此函数变量x内部赋值为8,并且返回这么一个对象{inc:function(){…}}

let fun = autoInc(8);

闭包慎用 

调用autoInc(8)完后,变量x在内存中会立即释放吗?
不会的。这就是闭包,因为fun对象,inc的键值,也就是这个匿名函数,在1中提到了,匿名函数用到了父函数autoInc中的定义的x了。这个匿名函数就是一个闭包。

因此闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包。

所以,闭包可以看做是父函数autoInc对象的公用方法(Public Method),内部变量x可以看做是父函数autoInc的私有属性(private value)。