闭包和垃圾收集:从链表中删除连续节点的最有效方法

时间:2012-12-09 01:25:56

标签: javascript garbage-collection linked-list nodes

我写了一个快速而又脏的javascript双链表实现。我希望能够一次删除多个(连续)节点,并且想知道:仅仅切断我要移除的这些最外层节点的末端,或者我是否必须单独删除每个节点。如果我正确理解javascript的垃圾收集,一旦没有任何东西指向那些连续的节点,即使它们仍然相互连接,它们应该由垃圾收集器处理,这是正确的吗? 如果有人能告诉我自己如何测试或验证这一点,我也非常感谢。

1 个答案:

答案 0 :(得分:6)

根据MDN

  

截至2012年,所有现代浏览器都提供了标记 - 清除垃圾收集器。在过去几年中,在JavaScript垃圾收集(生成/增量/并发/并行垃圾收集)领域所做的所有改进都是对该算法的实现改进,但不是对垃圾收集算法本身的改进,也没有减少对时间的定义。 “不再需要一个物体了”

标记和扫描算法从根对象开始,找到所有可到达的对象,然后收集所有不可到达的对象,因此对于这些浏览器,切断节点将没有问题。较旧的浏览器使用引用计数,这意味着只有在对它们有0引用时才收集对象,因此在这种情况下,双向链表的循环将是有问题的。然后,您需要以某种方式切断连续节点中的循环(将引用设置为null,删除关键字等等。)

因此,如果您正在为模式浏览器开发,那么一切都很好,但如果您希望与IE6 / 7等浏览器兼容,那么您需要一个稍微复杂的解决方案(它始终是这样的,不是它...... 。)