Javascript 如何知道使用document.createElement创建的元素是否仍然存在
我在PhantomJS测试中使用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
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);