我只是在javascript中使用作用域进行一些实验。 我的问题:在下面的代码片段中,“second”和“third”会被垃圾收集吗?在处理链表时,这可能特别有用。
var first = {}
var second = first;
var third = second;
first = null;
答案 0 :(得分:3)
没有。 second
和third
仍然引用了您的对象,因此无法对其进行垃圾回收。
执行此操作时:
var first = {};
var second = first;
您的变量second
没有first
的引用。它引用了first
指向的同一对象。所以,现在你有两个相等的变量,它们都引用了同一个对象。
设置时:
first = null;
所有,您确实清楚了first
变量中对该对象的引用。对象本身根本没有受到影响。而且,最重要的是对你的问题,变量second
根本没有受到影响,所以它仍然有对该对象的引用,因此它不能被垃圾收集。
对于要进行垃圾回收的Javascript中的对象,在代码中可访问代码中的任何位置都不能有对该对象的实时引用。只要second
仍然是可到达的变量,它指向的对象就不能被垃圾收集。
如果您知道带有指针的C ++语言,那么您可以像在
中一样思考一项任务var first = {};
喜欢将指向对象的指针放入first
。 first
实际上并不包含对象本身。该对象本身就存在。 first
只包含该对象的一个点。
然后,当你这样做时:
var second = first;
您创建另一个变量,然后从first
获取指针,并将该相同点的副本放入second
。现在你有两个完全独立的变量,它们都包含指向你对象的指针。请记住,对象存在于它自己的位置,所以当你这样做时:
first = null;
您正在做的就是清除first
中的指针。对象仍在那里,second
仍然包含指向它的指针。由于还有一个指向它的实时指针,因此该对象不会被垃圾收集。
要使您的对象被垃圾回收,您将需要包含对象的引用的所有三个变量,如下所示:
var first = {}
var second = first;
var third = second;
first = null;
second = null;
third = null;
或者,您需要将所有三个变量都超出范围,以便变量本身被垃圾收集。