JS 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。所以,作为开发者的我们并不需要太关心内存的回收。
JS 的垃圾收集机制原理其实是很简单的:找到那些不再继续使用的变量,然后释放其占用的内存。具体实现的方法有两种:标记清除和引用计数。
标记清除
在 JS 中,最常用的垃圾收集方法就是标记清除。当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为 “进入环境”。从逻辑上讲,永远不能释放那些进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能用到他们。而当变量离开环境时,则将其标记为 “离开环境”。
垃圾收集器在运行的时候会给存储在内存中的所有变量都加上这样的标记,然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。
如今,绝大多数的浏览器都是通过标记清除的方法来管理内存的。
引用计数
引用计数是一张不太常见的垃圾收集策略。引用计数的含义是跟踪记录每个值被引用的次数。
当生命了一个变量将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。
当某个值的引用次数变成0时,则说明没有办法再访问这个值,而且这个值也没有存在的意义了,所以它会被释放。