JavaScript: почему функция возвращает объект по ссылке?

Вот есть такой код:
<html>
<body>
<a href="#test" id="test">test</a>
<script>
function test()
{
var n = {c: 0};
    function clicker()
    {
   	 console.log(++n.c);
    }
document.getElementById('test').addEventListener("click", clicker);
return n;
}
var a = test();
</script>
</body>
</html>

Здесь, очевидно, clicker будет жить, поскольку повешен в качестве обработчика, а n замкнут и поэтому по кликам n.c будет наращивать значение. При этом обращение к a.c будет выдавать свежее значение n.c.
Значит, a ссылается на n.
Но вот вопрос - если бы не было функции cliker и создаваемого ей замыкания, то что бы осталось в памяти от функции test() из-за того, что она вернула ссылку на созданный объект? Ничего кроме объекта?

Вообще, насколько я понял в JS нет аналога "слабых ссылок" AS3, поэтому как проверять код на утечки - не пойму. Что посоветуете? DevTools?
  • Вопрос задан
  • 2719 просмотров
Решения вопроса 2
На сколько я могу судить, если бы не было подписки на событие, от функции ничего не осталось бы. Утечки в js возникают когда вы не отписываетесь от событий или (и) не удаляете dom элементы, оставляя их отсоединёнными но не удаленными.

В хроме в девтулс есть инструменты для поиска утечек, на вкладке профайлинга.
Ответ написан
Ничего кроме `n` не осталось бы. Работает довольно простой механизм подсчета ссылок - пока к обьекту есть доступ - он остается в памяти. И здесь разумеется работает принцип цепи. a -> b -> c: если к `а` нету ссылки, память освободится вместе с `b` и `c`, и не важно, что на `c` ссылается `b`.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы