JS 垃圾回收

一般内存的生命周期分为三个部分:

  • 分配所需要的内存(比如new一个对象,一般在高级语言里都是隐含的,不像c语言使用malloc来申请)

  • 使用分配到的内存(读、写)

  • 不需要时将其释放

引用计数垃圾回收

这是最天真的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。

  • 无法处理循环引用

标记-清除

这个算法把“对象是否不再需要”简化定义为“对象是否可以获得”。

这个算法假定设置一个叫做根(root)的对象(在Javascript里,根是全局对象)。垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象……从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。

这个算法比前一个要好,因为“有零引用的对象”总是不可获得的,但是相反却不一定,参考“循环引用”。

在上面的示例中,函数调用返回之后,两个对象从全局对象出发无法获取。因此,他们将会被垃圾回收器回收。第二个示例同样,一旦 div 和其事件处理无法从根获取到,他们将会被垃圾回收器回收

事件捕获和冒泡

【其他】JS漫谈 - 图2

stopPropagation 解决事件冒泡