读了JavaScript高级程序设计启发很多,从中了解了JS的垃圾收集机制
JS不同于C,C++等语言,他的垃圾回收机制不需要开发者专门去跟踪操作
他有两种垃圾收集方式:
1,引用计数:它的含义是标记每个值被引用的次数,当你声明了一个变量,并且给他赋值一个引用类型的数据,那么他的引用次数加1,这个值又赋值另外一个变量,那么他的引用次数再加一,相反,如果包含该引用的变量被赋值另外的值,那么他的引用次数减1,当引用次数为0的时候,他所占用的内存空间就会被收回,当垃圾收集器再次运行后,引用次数为0的内存将会被释放,但是他有一个严重的缺陷(循环引用):
function test(){
var objectA=new Objext();
var objectB=new Objext();
objectA.part=objectB;
objectB.part=objectA;
}
他们相互引用后,次数为2次,除非{objectA.part=null;objectB.part=null}这样手动改变赋值,否则该内存得不到释放,造成内存泄露。
2.标记清除:他是JS最常见的垃圾收集方式,当变量进入一个环境(函数中声明一个临时变量),就会把他标记成为:“进入环境”,当这个变量离开环境以后,标记为:“离开环境”,被标记"进入环境"中的变量是不能被释放的,相反释放的是标记为"离开环境"中的变量,这样就不存在循环引用的问题。
在IE9之前BOM与DOM对象使用的是C++以COM模型实现的,而C++垃圾收集就是引用计数,导致IE中只要涉及COM就存在
循环引用的问题,在IE9以后,BOM与DOM对象都转换成了真的JS对象,所以没有以上问题。
有的浏览器有自己的垃圾收集方法:在IE 中,调用 window.CollectGarbage()方法会立即执行垃圾收集。在 Opera 7 及更
高版本中,调用 window.opera.collect()也会启动垃圾收集例程,但是没必要,也不推荐。