js 内存回收机制 和 闭包定义
一个函数在执行开始的时候,会给其中定义的变量划分内存空间保存,以备后面的语句所用,等到函数执行完毕,这些变量就被认为是无用的,对应的空间会被收回。
下次再执行这个函数的时候,所有的变量又回到了最初的的状态,重新赋值使用。
但是当一个函数内部又嵌套了一个函数,而这个函数是有可能在外部被调用到的。并且这个内部函数又使用了外部函数的某些变量的话,这种内存回收机制就会出现问题。如果在外部函数返回后,又直接调用了内部函数。那么内部函数就无法读取他所需要的外部函数中的变量的值了。
所以js解释器在遇到函数定义的时候会自动把函数和他可能使用的变量一起保存下来。也就形成一个闭包。
这些变量不会被内存回收,只有当内部的函数不可能被调用以后(例如被删除、没有了指针),才会销毁这个闭包,而没有任何一个闭包引用的变量才会被下一次内存回收启动时回收。
闭包特性
1.函数嵌套函数
2.函数内部可以引用外部的参数和变量
3.参数和变量不会被回收
闭包好处
1.希望一个变量长期存储在内存中
2.避免全局变量的污染
3.私有成员的存在
闭包坏处
1.常驻内存,增加内存使用量
2.使用不当造成内存泄漏(一块被分配的内存既不能使用,又不能回收)
例:
function x(){
var a = 1;
function y(){
a++;
return a;
}
y()
}