Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Cтереть объект (освободить от него RAM)


Автор: Michael.de 6.11.2008, 02:17
Всем привет smile

Написал код для пояснения моего вопроса:
Код

<html>
<head>
<script type='text/javascript'>
var object, b, i=0;
var t=['Create & Append element','Remove element','Deleted ?','Try to delete'];
function init(){
 b=document.getElementById('b');
 set(t[i],create_and_append);
}
function set(text,onclick){
 b.innerHTML=t[i];
 b.onclick=onclick;
 i++;
}

function create_and_append(){
 object=document.createElement('table');
 object.style.cssText='position:absolute;left:200px;top:200px;background-color:#EEC;border:1px solid #00F';
 object.insertRow(0).insertCell(0).innerHTML='Bla bla';
 document.body.appendChild(object);
 set(t[i],remove);
}
function remove(){
 document.body.removeChild(object);
 set(t[i],is_deleted);
}
function is_deleted(){
 document.body.appendChild(object);
 set(t[i],try_to_delete);
}
function try_to_delete(){
 alert('Result: '+delete object);
}
</script>
</head>
<body onload='init();'>
<button id='b'></button>
</body>
</html>

removeChild
() удаляет объект из DOM-дерева, но не стирает его. delete стирает не все. В моей книжке об этом говорится следующее (перев. с нем.):
Код

...Тем не менее, Вы не можете удалить предопределенные свойства объекта и объекты...
Собственно вопрос: а чем их удалять из памяти? Мне пока пришла в голову только одна мысль object=null; А "поизящнее" ничего нет? smile

Автор: Zeroglif 6.11.2008, 12:31
Цитата(Michael.de @  6.11.2008,  02:17 Найти цитируемый пост)
delete стирает не все

'delete' удаляет свойство, если у этого свойства нет атрибута 'DontDelete', в вашем случае такой атрибут есть, т.к. 'object' - переменная при-var-енная к глобальному объекту.

Цитата(Michael.de @  6.11.2008,  02:17 Найти цитируемый пост)
а чем их удалять из памяти?

Сборщик в идеале сам удалит, наша задача - не удерживать в свойствах те значения, что нам больше не нужны (отсюда кратковременные значения должны жить в функциях плюс ненужные свойства можно удалять плюс ненужные значения можно переопределять). В реальной жизни на любом движке http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx может тупить, многие leaks http://msdn.microsoft.com/en-us/library/bb250448.aspx, алгоритм работы стараются http://msdnrss.thecoderblogs.com/2008/08/26/ie8-performance/...

Цитата(Michael.de @  6.11.2008,  02:17 Найти цитируемый пост)
Мне пока пришла в голову только одна мысль object=null;

Правильная мысль, даём новое значение, старое забыто (если не зацепилось за память в другом месте)...

Автор: Michael.de 6.11.2008, 18:17
Zeroglif, спасибо за ответ smile

Цитата(Zeroglif @  6.11.2008,  12:31 Найти цитируемый пост)
в вашем случае такой атрибут есть, т.к. 'object' - переменная при-var-енная к глобальному объекту.

Цитата(Zeroglif @  6.11.2008,  12:31 Найти цитируемый пост)
кратковременные значения должны жить в функциях

А как (например в моём случае) избавляться от глобальной переменной? И есть ли какие-либо стандартные "уловки"?

P.S. В принципе ответ на вопрос дан, но тему закрою попозже, т.к. хотелось бы получить ответ на доп. вопрос smile

Автор: Zeroglif 6.11.2008, 19:04
Цитата(Michael.de @  6.11.2008,  18:17 Найти цитируемый пост)
А как (например в моём случае) избавляться от глобальной переменной?

Вы сами ответили - object=null;

Автор: Michael.de 6.11.2008, 22:34
Zeroglif, я не точно выразился - имелось в виду не значение переменной (с этим мы уже разобрались), а отказ от использования глобальной переменной (замена её чем-либо другим) smile

Автор: IDVsbruck 7.11.2008, 04:04
А зачем?
Или назначь другое значение - переменные в js нетипизированы, или присвой null - она ничего весить не будет.
Гарбедж Коллектор ее не удалит, так как она находится в scope объекта window.
Можно вовсе отказаться от глобальных переменных, используя обертки-замыкания, но это не очень удобно да и зачем?

Автор: Michael.de 7.11.2008, 04:38
Цитата(IDVsbruck @  7.11.2008,  04:04 Найти цитируемый пост)
Можно вовсе отказаться от глобальных переменных, используя обертки-замыкания
Вот с этого момента поподробнее, плиз smile
smile с closure в связке с глоб. переменной smile

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

P.P.S. Никто не ответил... этот вопрос снимаю, тема помечена как "решённая" smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)