前言:
JavaScript的垃圾回收机制是为了防止内存泄漏的,所谓的内存泄漏是指当已经不需要某块内存时这块内存还存在着,而垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。
举个例子:我写了一个函数,在这个函数里面我声明了一个局部变量,那么当这个函数运行完了其实这个变量我们就不需要了,我们不会在乎这个变量还存不存在,反正我们已经用完了。那么如果这个变量我们实实在在的不用了但是它却不能被回收,为什么不能被回收呢?因为内存泄漏了,下一篇文章我会详细聊聊内存泄漏的问题。
1.标记清除(主要)
先明确一个点,是谁在回收,即,谁是垃圾回收的主体?答案是JavaScript。
有两种垃圾回收机制,标记清除和引用计数,先说说标记清除。
当变量进入执行环境的时候,比如说函数声明一个变量,那么这个时候变量被标记为“进入环境”,当函数执行结束后,变量被标记为“离开环境”,也就是说函数运行完了,这个变量也就被清理了。
然后,对于JavaScript来说,它的执行是,给内存中中的所有变量打上标记(可理解为我要删除得有个名单),先除去正在运行的变量,可理解为这个函数正在执行中,还有就是闭包,可理解为这个变量正在被引用(使用),除了这两个情况,其他的就会被回收。
2.引用计数(次要)
这个方式很简单,意思是说我要跟踪记录这个变量的引用次数,当它变成0的时候就被清理。
具体的规则如下:
比方说我声明一个变量,将一个引用类型(如对象)赋值给该变量的时候这个值的引用次数加一,如果这个变量的值变成另外一个,那么这个引用次数减一,当这个值的引用次数为0的时候,说明没有变量被使用了,于是这个值就被回收掉了