Как удалить холст javascript

Я хочу иметь кучу объектов, скажем так:

function Block() {
  this.canvas;
}

blocks = [];

а я при случае уточню:

block[x] = new Block();

и затем:

block.canvas = document.createElement('canvas');

но я также хочу удалить этот новый холст, чтобы иногда освободить память. Мне просто нужно сделать:

block.canvas = null; (or whatever the appropriate method is)

и тогда javascript освободит память на каком-то этапе? Или есть явный способ удалить объект и освободить память?

спасибо!

4 ответов


память, которая берется объектами, на которые нигде не ссылаются, восстанавливается в JavaScript с помощью вывоз мусора (MDN docu на этом).

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

Это можно сделать, как и вы, используя block.canvas = null; или (в зависимости от области объектов/свойств) delete block.canvas.

но будьте уверены, что вы удалите ссылка. Это также могут быть ссылки на DOM или любой другой объект!


этого недостаточно, если вы действительно используете этот холст для рисования объектов. Если вы добавляете холст в DOM, вам также нужно удалить его из него, иначе он останется в памяти, конечно. Если вы добавляете его с помощью appendChild, вы должны удалить его с помощью removeChild


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


Javascript имеет оператор с именем delete:

delete block.canvas;

примеры:http://www.openjs.com/articles/delete.php


большинство движков javascript использует подсчет ссылок или Марк-и-замены как его политика GC, поэтому любой объект без ссылки на глобальный объект (окно в среде браузера) будет освобожден на каком-то этапе.

так, чтобы обеспечить ваш <canvas> элемент может быть собран, вы должны убедиться:

  • никакая переменная или свойство не ссылается на это, запустив block.canvas = null вы
  • на <canvas> элемент больше не прикрепленный к дереву DOM, запустив canvas.parentNode.removeChild(canvas) вы могли бы сделать это сделать

из вашего кода, Вы не сделаете удаление DOM, может быть, ваш <canvas> не прикреплен к дереву DOM, но если это так, не забудьте удалить его.

PS: я заметил некоторые ответы metion delete ключевое слово для удаления canvas свойство, но это действительно не обязательно, GC работает так, как ожидалось сразу после block.canvas установлено значение null С a delete может привести к V8 беги медленнее!--31-->, мой совет-предотвратить использование delete.