什么时候JavaScript对象被破坏?

25 javascript

在C++中,我可以显式定义构造函数和析构函数,然后在构造函数/析构函数中使用cout <<"C或D Called"来确切知道在哪里.

但是在JavaScript中如何知道对象何时被破坏.以下示例是关注我的案例.

我在超时时调用内部函数,我想知道只要定时器正在运行,对象就会保持活动状态,等待再次调用next.

用户点击呼叫控制

// Calls  Control
Run Code Online (Sandbox Code Playgroud)

控制呼叫消息

var message_object = new Message( response_element );
Run Code Online (Sandbox Code Playgroud)

消息调用效果

new Effects().fade( this.element, 'down', 4000 );
message_object.display( 'empty' );
Run Code Online (Sandbox Code Playgroud)

效果

/**
 *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();
    }
};
Run Code Online (Sandbox Code Playgroud)

zet*_*len 26

JS对象本身没有析构函数.

当JavaScript对象(和基元)变得不可访问时,它们被垃圾收集,这意味着当前执行上下文中没有可能的引用时.JavaScript运行时必须持续监视此情况.因此,除非您使用delete关键字删除某些内容,否则它的破坏程度有点暴力.有些浏览器不善于检测闭包范围内的引用(我正在看你,Redmond),这就是为什么你经常看到在函数结束时将对象设置为null的原因 - 以确保在IE中释放内存.

  • JS对象在*变得无法访问后得到GCed*(你无法控制何时).在C++中,对象被破坏*当它们变得无法访问时. (15认同)
  • @JasonC:对不起,我在谈论C++的"自动"内存管理,RAII,"autoptr"等等. (3认同)
  • @JasonC如果你不使用`new`(就像任何理智的C++程序员那样).请参阅http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list. (3认同)
  • @Gabe在你明确*删除它们时,C++对象被销毁,无论它们是否可以在其他地方访问(事实上,从技术上讲,它们必须是可以访问它们才能删除它们).当*(或*之后*)它们变得无法访问时,它们不会被自动销毁*. (2认同)
  • [`delete`不会从内存中删除任何内容!](http://perfectionkills.com/understanding-delete/) (2认同)

小智 18

这种观念认为对象破坏可以简化为内存的垃圾收集,这对我来说是危险的误导,因为问题不能简化为释放内存.

析构函数负责释放其他资源,例如文件描述符或事件侦听器,这些资源不会通过垃圾回收自动处理.在这种情况下,绝对需要析构函数在释放内存之前解除状态,否则会泄漏资源.

在这种情况下,这是一个问题,析构函数不是一流的概念,无论是需要显式调用还是在对象无法访问后可以隐式调用.

处理此问题的最佳方法是,如果需要使用析构函数,则应适当地记录模块,并强调资源泄漏情况未能成功使用.