Вопрос по javascript – Когда уничтожаются объекты JavaScript?

24

В C ++ я могу явно определить конструктор и деструктор, а затем cout & lt; & lt; & quot; C или D Called & quot; с помощью функции конструктора / деструктора, чтобы точно знать, где.

Однако в JavaScript, как я знаю, когда объект разрушен. Пример ниже - случай, который касается меня.

Я вызываю внутреннюю функцию по тайм-ауту, и мне интересно, остается ли объект живым, пока работает таймер, ожидая вызова следующего.

User Click calls Control

// Calls  Control

Control calls Message

var message_object = new Message( response_element );

Message calls Effects

new Effects().fade( this.element, 'down', 4000 );
message_object.display( 'empty' );

Effects

/**
 *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();
    }
};
В общем, да, см. Ссылку выше для обсуждения конкретных условий освобождения объектов. Jakub Hampl
Какой объект вы беспокоитесь о продолжительности жизни? Phrogz
Смотрите такжеsomething like stackbased objects in c++ for javascript user
Нет, ты думаешь в обратном направлении. Элемент управления имеет ссылку на сообщение, но не обязательно наоборот. Если только у Effects нет какого-либо способа доступа к Message - что он не делает, если только Message не вызвал его или не передал на него ссылку на себя - Message исчезнет. Да, этот элемент остается, но объект вокруг него исчезает. zetlen
Сборка мусора JavaScript -stackoverflow.com/q/864516/402706 Brandon Boone

Ваш Ответ

4   ответа
0

window.requestIdleCallback (), который вызывает обратно, когда браузер бездействует. Это может быть использовано для имитации деструктора экземпляра класса.

Почти такой же эффект можно получить из следующего кода:

setTimeout(function()
    {
    // Simulate destructor here
    },0);

Это устанавливает автоматически отклоненный тайм-аут, который завершается, когда завершается текущий сценарий JavaScript (и цикл основного события возобновляется).

26

Объекты JavaScript (и примитивы), когда они становятсяinaccessibleЭто означает, что в текущем контексте выполнения на них нет возможных ссылок. Среда выполнения JavaScript должна постоянно следить за этим. Так что, если вы не используетеdelete Ключевое слово, чтобы удалить что-то, то его уничтожение вроде как под капотом. Некоторые браузеры плохо распознают ссылки, оставленные в области закрытия (я смотрю на вас, Редмонд), и поэтому вы часто видите, что объекты имеют нулевое значение в конце функций - чтобы убедиться, что память освобождена в IE ,

Error: User Rate Limit ExceedednewError: User Rate Limit Exceededstackoverflow.com/questions/388242/….
Error: User Rate Limit ExceededafterError: User Rate Limit ExceededwhenError: User Rate Limit Exceeded
Error: User Rate Limit ExceededexplicitlyError: User Rate Limit ExceededwhenError: User Rate Limit ExceededafterError: User Rate Limit Exceeded
Error: User Rate Limit ExceededautoptrError: User Rate Limit Exceeded
14

что уничтожение объектов сводится к сбору мусора для памяти, кажется мне опасным заблуждением, поскольку проблема не сводится к освобождению памяти.

Деструкторы отвечают за освобождение других ресурсов, таких как файловые дескрипторы или прослушиватели событий, которые не обрабатываются автоматически при сборке мусора. В таких случаях деструкторам абсолютно необходимо разматывать состояние перед освобождением памяти, иначе вы потеряете ресурсы.

В таких случаях проблема состоит в том, что деструкторы не являются первоклассным понятием, должны ли они вызываться явно или могут вызываться неявно после того, как объект становится недоступным.

Лучший способ справиться с этим - надлежащим образом документировать ваши модули, если им нужны деструкторы, и подчеркивать сценарии утечки ресурсов, которые терпят неудачу при таком использовании.

Error: User Rate Limit Exceeded
4

сора позаботится обо всем, что требует памяти в вашем скрипте. Так что на самом деле вопрос должен быть больше похож на

"How does the Garbage Collector know when it can free memory for objects"

Проще говоря, большинство GC смотрят, есть ли какие-либо активные ссылки. Это может быть связано с родительским контекстным объектом, цепочками прототипов или любым прямым доступом к данному объекту. В вашем конкретном случае, в любое времяsetTimeout выполняется, он будет вызыватьnext() который закрывается над.fade() родительский контекст и.face() функция в свою очередь держит замыкание наEffects функция (контекст).

Это означает, что до тех пор, пока естьsetTimeoutВся эта конструкция хранится в памяти.

Вы можете иногда немного помочь старым реализациям GC,nullИспользование переменных / ссылок на него может собирать некоторые вещи раньше или вообще, но современные реализации довольно умны в этом отношении. На самом деле вам не нужно заботиться о таких вещах, как «время жизни объекта / ссылки».

Error: User Rate Limit Exceeded

Похожие вопросы