Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удаление узла (https://javascript.ru/forum/misc/69474-udalenie-uzla.html)

Luca 26.06.2017 15:48

Удаление узла
 
Здравствуйте.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    let img = document.createElement('img');
    img.setAttribute('src', '7.jpg');
    img.addEventListener('error', ()=>{console.log('ошибка'); img.remove();});/*Здесь!*/
    img.addEventListener( 'load', ()=>{console.log('загрузился я'); setTimeout(()=>{app.appendChild(img)},2000);});
</script>
</body>
</html>

Например, загружаю я картинку, а её, картинки, нет, но память то я выделил (пусть немного, но тем не менее). если в консоль ввести img, то мы получим
<img src="7.jpg">

как это удалить? я так понимаю, что эта фигня так и будет болтаться пока её явно не удалишь.
по аналогии с другими языками:
img = null; delete img;

ошибок код не вызывает, но насколько это корректно и как в такой ситуации правильно поступить?

ruslan_mart 26.06.2017 16:08

Luca, ничего вычищать не нужно, почитайте про сборщик мусора.

Luca 26.06.2017 16:27

Сборщик мусора удаляет область памяти, если на эту область нет ссылок, те в данном случае
img = null;

но саму переменную img сборщик не удалит ведь.
имхо хотя бы img = null точно надо

ksa 27.06.2017 08:31

Цитата:

Сообщение от Luca
как это удалить?

Если так переживаешь - делай так.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
(function(){
    let img = document.createElement('img');
    img.setAttribute('src', '7.jpg');
    img.addEventListener('error', ()=>{console.log('ошибка'); img.remove();});/*Здесь!*/
    img.addEventListener( 'load', ()=>{console.log('загрузился я'); setTimeout(()=>{app.appendChild(img)},2000);});
})();
</script>
</body>
</html>

Или как там это пишут в новомоднем синтаксисе?

Rasy 27.06.2017 11:33

Цитата:

Сообщение от ksa
Или как там это пишут в новомоднем синтаксисе?

http://es6-features.org/#BlockScopedFunctions

Luca 28.06.2017 06:08

img.remove();

первое, что сделал, но в ответ после этого
Цитата:

> img
><img src='7.jpg'></img>
и ничего не удаляется. и через парент пробовал. фиг знает ...
Цитата:

Или как там это пишут в новомоднем синтаксисе?
В этом плане, так как я начинающий, то для меня это, практически, единственный синтаксис. Притом во всех современных браузерах это работает и даже больше - async/await без транспайла. Еще кайф - это grid'ы, как начинающий, на них тоже ставку делаю.

ksa 28.06.2017 08:38

Цитата:

Сообщение от Luca
так как я начинающий, то для меня это, практически, единственный синтаксис

Идея в том, что нужно все сделать в анонимной функции. ;)
После того как она отработает, все переменные, которые были в ней созданы исчезнут.

Если, конечно, не останется функций, которые смогут их использовать. :D


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