Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Обсуждений тред (https://javascript.ru/forum/offtopic/47364-obsuzhdenijj-tred.html)

cyber 27.02.2015 02:56

Вопрос про утечку памяти.
Если я удаляю ДОМ элементы, а у него есть дети, при удаление родительского элемента, он уалится только если нету ссылок на него или детей. По идее отдельно детей не нужно удалять.
Но допустим на его дочерний элемент есть ссылка в свойстве то элемент не удалится ?

kobezzza 27.02.2015 08:22

Цитата:

Сообщение от cyber (Сообщение 358656)
Вопрос про утечку памяти.
Если я удаляю ДОМ элементы, а у него есть дети, при удаление родительского элемента, он уалится только если нету ссылок на него или детей. По идее отдельно детей не нужно удалять.
Но допустим на его дочерний элемент есть ссылка в свойстве то элемент не удалится ?

Тут сморя как удаляешь: если через innerHTML, то там в каждом браузере по своему, а если через removeChild, то элемент удаляется из DOM, но если на него есть ссылка, то он и все связанные с ним узлы останутся в памяти, что в общем логично.

cyber 27.02.2015 10:44

Цитата:

Сообщение от kobezzza
но если на него есть ссылка

Если его значение присвоенно какому то свойству то это считается ссылка?

Zend 27.02.2015 10:56

Цитата:

Сообщение от cyber
Если его значение присвоенно какому то свойству то это считается ссылка?

Если ты из кода можешь обратиться к этому свойству то считается. При условии что элемент удалён.

cyber 27.02.2015 10:57

Цитата:

Сообщение от Zend
Если ты из кода можешь обратиться к этому свойству то считается.

Спасибо, а то в этом у меня давно путаница.
Т.е в общем достаточно удалить родительский элемент и ссылки на его детей?

kobezzza 27.02.2015 10:59

Цитата:

Сообщение от cyber (Сообщение 358700)
Если его значение присвоенно какому то свойству то это считается ссылка?

Если ты имеешь доступ к ней, то конечно, я так понял ты имеешь ввиду что если ссылка установлена другой ноде, которая не была удалена? То да, логично, что раз ты можешь получить доступ к этой ноде (через обращение DOM или переменную / свойство), то у тебя и есть ссылка на ту, убитую ноду и следовательно она будет жива (а вместе с ней и все е] чилды) до тех пор пока жива ссылка.

cyber 27.02.2015 11:00

Цитата:

Сообщение от kobezzza
Если ты имеешь доступ к ней, то конечно, я так понял ты имеешь ввиду что если ссылка установлена другой ноде, которая не была удалена? То да, логично, что раз ты можешь получить доступ к этой ноде (через обращение DOM или переменную / свойство), то у тебя и есть ссылка на ту, убитую ноду и следовательно она будет жива (а вместе с ней и все е] чилды) до тех пор пока жива ссылка.

Спасибо, значить я все правильно понимал)))

kobezzza 27.02.2015 11:02

Цитата:

Т.е в общем достаточно удалить родительский элемент и ссылки на его детей?
Да, но в таком случае ссылки лучше хранить в WeakMap, и тогда все будет чистится автоматом.

В этом и крутость WeakMap / WeakSet, что ты можешь добавить туда ссылку на элемент, но если элемент будет удален, то он удалится автоматом.

Например, у тебя на сервере есть объект, соединений пользователей и ты добавляешь его в WeakMap,

var map = new WeakMap();

app.listen(function (req, res) {
    map.add(req, {
       sessionID: '',
       someValue: ''
    })
});


А если соединение порвется, то оно автоматом кильнется из WeakMap (если конечно нет других ссылок).

kobezzza 27.02.2015 11:06

Цитата:

Сообщение от cyber (Сообщение 358717)
Спасибо, значить я все правильно понимал)))

Только учти, что при удалении через innerHTML все не так :)

cyber 27.02.2015 11:07

Цитата:

Сообщение от kobezzza
Да, но в таком случае ссылки лучше хранить в WeakMap, и тогда все будет чистится автоматом.

В этом и крутость WeakMap / WeakSet, что ты можешь добавить туда ссылку на элемент, но если элемент будет удален, то он удалится автоматом

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


Часовой пояс GMT +3, время: 00:50.