指向null的javascript对象链是否会被垃圾回收?

时间:2016-05-29 19:40:23

标签: javascript performance garbage-collection

我只是在javascript中使用作用域进行一些实验。 我的问题:在下面的代码片段中,“second”和“third”会被垃圾收集吗?在处理链表时,这可能特别有用。

var first = {}
var second = first;
var third = second;

first = null;

1 个答案:

答案 0 :(得分:3)

没有。 secondthird仍然引用了您的对象,因此无法对其进行垃圾回收。

执行此操作时:

var first = {};
var second = first;

您的变量second没有first的引用。它引用了first指向的同一对象。所以,现在你有两个相等的变量,它们都引用了同一个对象。

设置时:

 first = null;

所有,您确实清楚了first变量中对该对象的引用。对象本身根本没有受到影响。而且,最重要的是对你的问题,变量second根本没有受到影响,所以它仍然有对该对象的引用,因此它不能被垃圾收集。

对于要进行垃圾回收的Javascript中的对象,在代码中可访问代码中的任何位置都不能有对该对象的实时引用。只要second仍然是可到达的变量,它指向的对象就不能被垃圾收集。

如果您知道带有指针的C ++语言,那么您可以像在

中一样思考一项任务
var first = {};

喜欢将指向对象的指针放入firstfirst实际上并不包含对象本身。该对象本身就存在。 first只包含该对象的一个​​点。

然后,当你这样做时:

var second = first;

您创建另一个变量,然后从first获取指针,并将该相同点的副本放入second。现在你有两个完全独立的变量,它们都包含指向你对象的指针。请记住,对象存在于它自己的位置,所以当你这样做时:

first = null;

您正在做的就是清除first中的指针。对象仍在那里,second仍然包含指向它的指针。由于还有一个指向它的实时指针,因此该对象不会被垃圾收集。

要使您的对象被垃圾回收,您将需要包含对象的引用的所有三个变量,如下所示:

var first = {}
var second = first;
var third = second;

first = null;
second = null;
third = null;

或者,您需要将所有三个变量都超出范围,以便变量本身被垃圾收集。