2015-02-17 5 views
5

Я строй яваскрипта игры, которая создает объект «уровня» с помощью вара:Как определить, был ли объект мусором, собранным в Javascript?

function start() { 
    var myGameLevel = new Level(2); 
} 

Этого «Level()» объект имеет множество функций, в первую очередь добавление элементов в DOM и сделать их интерактивными. Упрощение:

function Level(i) { 
    var _difficulty = i; 

    this.init = function(){ 
     jQuery("#container").append(...game elements here...); 
     jQuery("#button").on('click', function() {...}); 
    } 
} 

Мой вопрос: как я могу знать, если объект Level создан в функции «старт» был сборщиком мусора, или нет? Я стараюсь использовать только переменные «var», чтобы не было внешних ссылок. Когда DOM очищается от всех игровых элементов, я EXPECT объект уровня, который будет выпущен из памяти, но как я могу быть уверен?

+0

Если вы используете Chrome, вы пробовали профилирование памяти в отладчике? – dowomenfart

+0

Ну, я не уверен, что искать? Так как весь объект уровня анонимен? Отладчик Chrome имеет множество экранов, списков и параметров. Где я могу найти свой объект «Уровень»? – Kokodoko

+0

@ Kokodoko у вас получилось обходное решение? –

ответ

3

Я не думаю, что вы можете управлять сбором мусора JavaScript. Обычно переменную или объект можно собирать, если нет ссылок на него. Таким образом, вы можете увеличить свои шансы на сбор объекта, разработав свою логику, чтобы объект вышел из сферы действия.

+0

Мне не нужно это контролировать, я просто хочу знать, был ли объект GC'ed или нет. Поскольку все это анонимно, я не могу получить доступ к нему в консоли или в коде, но он все еще может существовать. – Kokodoko

5

Слабые ссылки are considered a security risk и, следовательно, недоступны для непривилегированного кода в браузерах.

Эти проблемы не относятся к выполнению javascript привилегированных кодов или серверов, например. через node.js, и, следовательно, для них могут быть доступны слабые справочные реализации платформы.
. Модули расширения могут использовать Components.utils.getWeakReference()

Для некоторых моделей программирования WeakMap/WeakSet может быть достаточно, но они не позволяют программе следить за вывоз мусора, потому что для этого ему потребуется ключ, чтобы зондировать эти структуры данных, но держась за что ключ предотвратит сбор объектов в первую очередь.

Дополнительное беспокойство, высказанное разработчиками JS, заключается в том, что в зависимости от того, насколько мощными могут быть гипотетические слабые API ref ref. предлагая уведомления о завершении - он может выявить значительное количество поведения GC, которое, в свою очередь, может ограничить будущие реализации, поскольку изменение поведения может привести к поломке веб-приложений.


Update: Там в настоящее время is a proposal стандартизировать слабые ссылки в JS, что снижает возможные риски, связывая освобождение слабо достижимых объектов в цикле обработки событий JS, что делает поведение более детерминированным.

+0

Значит, вы говорите, что я никогда не должен использовать «var myLevel = Level()»? Это может быть хорошим советом, но вопрос все еще стоит: после того, как я установил значение myLevel равным null, как я могу быть уверенным, что Thing() еще не запущен код? Мне сложно установить PIN-код в Chrome Inspector. – Kokodoko

+0

Нет, я говорю, что единственный способ обнаружить, что что-то было собрано в мусор, было бы слабыми ссылками. Но слабые ссылки недоступны для непривилегированного кода. – the8472

+0

Что, черт возьми, ты говоришь?Нет, где в этой ссылке упоминается о рисках безопасности. –

Смежные вопросы