Вопрос по javascript – Когда уничтожаются объекты JavaScript?
В 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();
}
};
window.requestIdleCallback (), который вызывает обратно, когда браузер бездействует. Это может быть использовано для имитации деструктора экземпляра класса.
Почти такой же эффект можно получить из следующего кода:
setTimeout(function()
{
// Simulate destructor here
},0);
Это устанавливает автоматически отклоненный тайм-аут, который завершается, когда завершается текущий сценарий JavaScript (и цикл основного события возобновляется).
Объекты JavaScript (и примитивы), когда они становятсяinaccessibleЭто означает, что в текущем контексте выполнения на них нет возможных ссылок. Среда выполнения JavaScript должна постоянно следить за этим. Так что, если вы не используетеdelete
Ключевое слово, чтобы удалить что-то, то его уничтожение вроде как под капотом. Некоторые браузеры плохо распознают ссылки, оставленные в области закрытия (я смотрю на вас, Редмонд), и поэтому вы часто видите, что объекты имеют нулевое значение в конце функций - чтобы убедиться, что память освобождена в IE ,
new
Error: User Rate Limit Exceededstackoverflow.com/questions/388242/….
что уничтожение объектов сводится к сбору мусора для памяти, кажется мне опасным заблуждением, поскольку проблема не сводится к освобождению памяти.
Деструкторы отвечают за освобождение других ресурсов, таких как файловые дескрипторы или прослушиватели событий, которые не обрабатываются автоматически при сборке мусора. В таких случаях деструкторам абсолютно необходимо разматывать состояние перед освобождением памяти, иначе вы потеряете ресурсы.
В таких случаях проблема состоит в том, что деструкторы не являются первоклассным понятием, должны ли они вызываться явно или могут вызываться неявно после того, как объект становится недоступным.
Лучший способ справиться с этим - надлежащим образом документировать ваши модули, если им нужны деструкторы, и подчеркивать сценарии утечки ресурсов, которые терпят неудачу при таком использовании.
сора позаботится обо всем, что требует памяти в вашем скрипте. Так что на самом деле вопрос должен быть больше похож на
"How does the Garbage Collector know when it can free memory for objects"
Проще говоря, большинство GC смотрят, есть ли какие-либо активные ссылки. Это может быть связано с родительским контекстным объектом, цепочками прототипов или любым прямым доступом к данному объекту. В вашем конкретном случае, в любое времяsetTimeout
выполняется, он будет вызыватьnext()
который закрывается над.fade()
родительский контекст и.face()
функция в свою очередь держит замыкание наEffects
функция (контекст).
Это означает, что до тех пор, пока естьsetTimeout
Вся эта конструкция хранится в памяти.
Вы можете иногда немного помочь старым реализациям GC,null
Использование переменных / ссылок на него может собирать некоторые вещи раньше или вообще, но современные реализации довольно умны в этом отношении. На самом деле вам не нужно заботиться о таких вещах, как «время жизни объекта / ссылки».