文章转自:http://www.dev26.com/blog/article/195
javascript本身是具有垃圾收集程序的,有规定的间隔时间会自动执行收集那些不在使用的变量.
原理是当变量的生命周期结束以后打上相应的标记.当垃圾程序执行时会自动回收这些带有标记
的变量所占内存.
其中局部变量的生命周期是在函数执行结束以后打上不在被引用的标记,对于如何打标记.各个浏览
器实现有所不同,大概有如两种:
1.打清除标记
主流的一些浏览器(IE、FireFox、Opera、chrome、Safari等..)大多都是使用的这种标记的策略,大概
意思就是垃圾收集程序一运行就给当前环境中的所有变量都打上删除标记,然后在一个个查找每个变量
是否被引用如果有则说明这个变量还在被使用就把删除标记清掉,如果没有则保留。最后保留有删除标记
的所占用的内存将被回收。
2.引用计数
这种方式目前已经似乎已经没有了,在早期的一些浏览器中使用过。Netscape Navigator3.0版中有使用。
原理就是当声明了一个变量的引用。这个引用的指针就指向了这个值。从而这个值被引用的数量就+1,如果减少
一个引用就-1,当这个值被指向的数量为0的时候,下次垃圾回收程序会回收所占内存.
比如:
var a= new Object();
var b=a;
这样a 和 b都指向一个实例,这个值的计数就是2.如果把:b=null;则数量就会-1,大概就这意思.引用计数呢容易
引起一些问题其中最严重的是无法解决循环引用的问题。
例如:
function add(){
var arg1=new Object();
var arg2=new Object();
arg1.param1=arg2;
arg2.param2=arg1;
}
上面这函数呢,arg1中引用了arg2,arg2中呢也引用了arg1,两个实例的count=2.这样在函数执行结束以后呢,
它们不能够被回收内存因为它俩计数永远也不能归为,不停执行这函数就内存溢出了。