Javascript 如何知道使用document.createElement创建的元素是否仍然存在

Javascript 如何知道使用document.createElement创建的元素是否仍然存在,javascript,garbage-collection,phantomjs,Javascript,Garbage Collection,Phantomjs,我在PhantomJS测试中使用document.createElement创建锚元素,如下所示: var mockLink = null; beforeEach(function() { mockLink = document.createElement('a'); }); it('should foo', function() { // Use mockLink in some way }); 我想在每个代码之后清理中的元素,以便每个测试都有一个新创建的实例。不幸的是,elem

我在PhantomJS测试中使用
document.createElement
创建锚元素,如下所示:

var mockLink = null;

beforeEach(function() {
  mockLink = document.createElement('a');
});

it('should foo', function() {
  // Use mockLink in some way
});
我想在每个代码之后清理
中的元素,以便每个测试都有一个新创建的实例。不幸的是,
element.remove()
在PhantomJS中不受支持

我想在不添加

PhantomJS支持
removeChild
,但我新创建的元素没有父元素:

mockLink.parentElement // undefined
mockLink.parentElement.removeChild(mockLink); // doesn't work
mockLink.parentNode // also undefined
我新创建的链接似乎根本不在文档中

mockLink.href = 'www.google.com';
document.getElementsByTagName('a'); // doesn't contain google.com
所以我做不到

document.removeChild(mockLink);
mockLink.ownerDocument.contains(mockLink)
还返回
false


似乎除了我的
mockLink
变量之外,任何地方都没有对
mockLink
的引用,这意味着如果我想通过垃圾收集释放内存,我可以将
mockLink
设置为
null
。但我如何验证这一点?如果我将任何其他变量设置为
mockLink
,然后设置为
console.log
它,它仍然会按定义显示,因为它将是对内存中相同空间的新引用。当我将变量设置为
null
时,如何验证
mockLink
是否真的被删除?

您发现了一个难题

如果通过设置
mockLink=null
并确保没有对元素的其他引用来终止对该元素的所有引用,则垃圾收集器应该能够释放该对象

但是,您无法验证这一点,因为为了验证元素不再可用,您必须保留对它的引用,但这将首先防止它被垃圾收集。因此,难题就来了

这是一个不能直接从Javascript本身来衡量的问题


如果您想设计一个一次性测试来确保内存被回收,那么您可以拍摄一个内存快照,创建一个数组中存储的几十万个对象,清除数组,等待GC运行一小段时间,拍摄另一个内存快照,将同一过程重复几次,确认该过程的内存使用量没有稳步增加,或者研究内存快照以确保这些对象都没有出现在内存占用空间中。

您发现自己是一个难题

如果通过设置
mockLink=null
并确保没有对元素的其他引用来终止对该元素的所有引用,则垃圾收集器应该能够释放该对象

但是,您无法验证这一点,因为为了验证元素不再可用,您必须保留对它的引用,但这将首先防止它被垃圾收集。因此,难题就来了

这是一个不能直接从Javascript本身来衡量的问题


如果您想设计一个一次性测试来确保内存被回收,那么您可以拍摄一个内存快照,创建一个数组中存储的几十万个对象,清除数组,等待GC运行一小段时间,拍摄另一个内存快照,将同一过程重复多次,并验证该过程的内存使用量没有稳步增加,或者研究内存快照,以确保这些对象都不会出现在内存占用空间中。

如果您的javascript环境支持弱引用,则可以创建对节点的弱引用。根据实现的不同,通知机制(如回调或引用队列)也可能可用,这些通知机制会告诉您何时已收集


web浏览器中的非特权javascript上下文目前不提供这样的API。Node.js、Nashorn和浏览器加载项环境都支持。

如果您的javascript环境支持弱引用,则可以创建对节点的弱引用。根据实现的不同,通知机制(如回调或引用队列)也可能可用,这些通知机制会告诉您何时已收集


web浏览器中的非特权javascript上下文目前不提供这样的API。Node.js、Nashorn和浏览器加载项环境都有。

如果它没有父项,那么它就不是DOM的一部分,对吗?为什么不干脆删除对它的引用呢?如果它没有父对象,那么它就不是DOM的一部分,对吗?为什么不干脆删除对它的引用?
document.removeChild(mockLink);