В книге Николая Закаса он объясняет проблему циклического обращения при использовании подсчета ссылок для сбора мусора в Javascript. Он использует следующий пример:
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}
объясняя, что у двух объектов никогда не будет выделенной им памяти, поскольку у них есть две ссылки на них внутри функции. Я хотел бы прояснить, как это работает.
Ясно, что для каждого объекта есть две ссылки. Первый объект имеет как objectA
, так и objectB.anotherObject
, указывающие на него. Таким образом, подсчет ссылок для каждого объекта равен 2. Но что происходит, когда функция выйдет? Это не описано в книге. Он говорит, что счетчик ссылок уменьшается, всякий раз, когда ссылка на значение перезаписывается другим значением. Я думаю, это означает:
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
objectA.someOtherObject = objectA; //<-- that if I were to do this,
//the reference count of the first object (A)
//would become 3, and 1 for the second object (B).
}
Но что происходит, когда функция выходит? Насколько я понимаю, оба objectA
и objectB
и их соответствующие свойства, которые ссылаются друг на друга, будут уничтожены, и, следовательно, счетчики ссылок на два объекта будут уменьшены на 2. Я не вижу "круглую ссылку" проблема ", о которой говорит Закас. Может ли кто-нибудь объяснить, что он пытается сказать?