JavaScript中也具备自动垃圾回收机制(GC:Garbage Collection);浏览器
由于内存内容是极其有限的,因此垃圾收集器会按期(周期性)找出那些不在继续使用的变量,而后释放内存闭包
其中再也不使用的变量通常只多是局部变量,即在函数执行结束的时候,所使用的局部变量所占的内存会随之被回收,固然在闭包中内部函数会占用着外部函数的局部变量。函数
到底哪一个变量是没有用的?因此垃圾收集器必须跟踪到底哪一个变量没用,对于再也不有用的变量打上标记,以备未来收回其内存。spa
用于标记的无用变量的策略可能因实现而有所区别,一般状况下有两种实现方式:标记清除和引用计数。引用计数不太经常使用,标记清除较为经常使用。对象
垃圾回收器在运行的时候会给存储在内存中的全部变量都加上标记(固然,可使用任何标记方式)。而后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记(闭包)。而在此以后再被加上标记的变量将被视为准备删除的变量,缘由是环境中的变量已经没法访问到这些变量了。最后,垃圾回收器完成内存清除工做,销毁那些带标记的值并回收它们所占用的内存空间。ip
到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或相似的策略,只不过垃圾收集的时间间隔互不相同。内存
引用计数的含义是跟踪记录每一个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。若是同一个值又被赋给另外一个变量,则该值的引用次数加1。相反,若是包含对这个值引用的变量又取得了另一个值,则这个值的引用次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值了,于是就能够将其占用的内存空间回收回来。这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为0的值所占用的内存。字符串
垃圾回收器周期性运行,若是分配的内存很是多,那么回收工做也会很艰巨,肯定垃圾回收时间间隔就变成了一个值得思考的问题。IE6的垃圾回收是根据内存分配量运行的,当环境中存在256个变量、4096个对象、64k的字符串任意一种状况的时候就会触发垃圾回收器工做,看起来很科学,不用按一段时间就调用一次,有时候会不必,这样按需调用不是很好吗?可是若是环境中就是有这么多变量等一直存在,如今脚本如此复杂,很正常,那么结果就是垃圾回收器一直在工做,这样浏览器就无法儿玩儿了。io
微软在IE7中作了调整,触发条件再也不是固定的,而是动态修改的,初始值和IE6相同,若是垃圾回收器回收的内存分配量低于程序占用内存的15%,说明大部份内存不可被回收,设的垃圾回收触发条件过于敏感,这时候把临街条件翻倍,若是回收的内存高于85%,说明大部份内存早就该清理了,这时候把触发条件置回。这样就使垃圾回收工做职能了不少。变量