JS中的垃圾回收机制有两种:标记清除和引用计数
标记清除
标记清除是JS中最常见的垃圾回收方式。当变量进入执行环境的时候,比如在函数中声明一个变量,垃圾回收器将器标记为“进入环境”;当变量离开环境(函数运行结束的时候),将其标记为“离开环境”。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境变量中的变量及被环境变量中变量引用的变量(闭包)的标记。在完成这些之后依旧存在的标记就是要删除的变量。
引用计数
在低版本IE中经常会发生内存泄漏,很多时候就是因为它采取引用计数的方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数。
当声明一个变量并将一个引用类型赋值给该变量的时候,这个值的引用次数就加1.如果改变了的值变成了另一个,则这个值的引用数会减1当这个值的引用次数为0的时候,说明没有变量在使用,这个值无法被访问。因此,可以将它占用的空间回收,这样垃圾回收器会在运行的时候清理引用次数为0的值的占用空间。
在IE中虽然JS对象通过标记清除的方式进行垃圾回收,但是BOM与DOM对象是用引用计数的方式回收垃圾的。也就是说,只要涉及BOM与DOM,就会出现循环引用问题。