JavaScript对象何时被销毁?
在C ++中,我可以明确地定义一个构造函数和析构函数,然后在构造函数/析构函数中用cout <<“C或D调用”from来精确地知道在哪里。
然而,在JavaScript中,我怎么知道对象何时被破坏。 下面的例子是关于我的情况。
我正在调用一个超时的内部函数,并且我想知道,只要定时器正在运行,对象就会保持活动状态,等待再次调用下一个。
用户点击呼叫控制
// Calls Control
控制呼叫消息
var message_object = new Message( response_element );
消息调用效果
new Effects().fade( this.element, 'down', 4000 );
message_object.display( 'empty' );
效果
/**
*Effects - build out as needed
* element - holds the element to fade
* direction - determines which way to fade the element
* max_time - length of the fade
*/
var Effects = function( )
{
this.fade = function( element, direction, max_time )
{
element.elapsed = 0;
clearTimeout( element.timeout_id );
function next()
{
element.elapsed += 10;
if ( direction === 'up' )
{
element.style.opacity = element.elapsed / max_time;
}
else if ( direction === 'down' )
{
element.style.opacity = ( max_time - element.elapsed ) / max_time;
}
if ( element.elapsed <= max_time )
{
element.timeout_id = setTimeout( next, 10 );
}
}
next();
}
};
JS对象本身没有析构函数。
JavaScript对象(和基元)在变得不可访问时被垃圾收集,这意味着当前执行上下文中没有可能引用它们。 JavaScript运行时必须持续监视这一点。 所以,除非你使用delete
关键字来删除某些东西,否则它的破坏就在幕后。 有些浏览器在检测闭包中的引用时很糟糕(我在看你,Redmond),这就是为什么你经常看到对象在函数结束时被设置为null,以确保内存在IE中被释放。
这个观点认为,对象的破坏可以归结为垃圾回收,因为这个问题不能简化为释放内存。
析构函数负责释放其他资源,如文件描述符或事件侦听器,这些资源不是通过垃圾回收自动处理的。 在这种情况下,解析器绝对需要在释放内存之前展开状态,否则将泄漏资源。
在这种情况下,析构函数不是一流的概念,无论它们是需要显式调用还是可以在对象变得无法访问后隐式调用。
处理这个问题的最好方法是在需要使用析构函数的情况下适当地记录您的模块,并强调资源泄漏情况未能如此使用。
ECMAscript中根本没有动态内存管理。 垃圾收集器将处理脚本中需要内存的任何内容。 所以实际上这个问题应该更像是,
“垃圾收集器如何知道它何时可以释放对象的内存”
简单地说,大多数GC都会查看是否有任何活动参考。 这可能是由于父上下文对象,原型链或对给定对象的任何直接访问。 在你的特定实例中, setTimeout
随时被执行,它会调用next()
.face()
函数关闭.fade()
父上下文,而.face()
函数继而关闭Effects
函数(上下文)。
这意味着,只要有setTimeout
调用,整个构造就被保存在内存中。
你可以通过null
变量来帮助老旧的GC实现 - 它可以提前收集一些东西,或者根本就可以收集一些东西,但是现代的实现对这些东西来说非常聪明。 您实际上不必关心诸如“对象/参考实时时间”之类的内容。