2016-12-27 2 views
1

К примеру, у меня есть этот код:Javascript циклическое - разорвать порочный круг

var objectA = {}; 
var objectB = {}; 

objectA.pointer = objectB; 
objectB.pointer = objectA; 

objectA = null; 
objectB = null; 

Я предполагаю, что после двух последних заявлений, нет ссылок на объекты, первоначально назначенных Objecta и objectB переменных. Но, согласно технической литературе, ссылка на эти объекты все еще существует. Зачем ? Does objectA.pointer ссылка или объектB.pointer ссылка все еще существует, даже объект A и objectB установлены в нуль?

+3

'objectA = null;' только устанавливает значение переменной * 'objectA' в' null'. Он не изменяет значение свойства * 'objectB.pointer'. 'objectB.pointer' по-прежнему относится к объекту. Переменные/свойства - это просто контейнеры для значений.Назначения «копируют» значение, а теперь два контейнера содержат «одинаковое» значение (каждый из них имеет свою собственную копию). Замена значения в одном из контейнеров не волшебным образом заменяет значение в другом контейнере. –

+0

Настройка 'objectA' на' null' не изменяет 'objectB.pointer' – vlaz

+0

@FelixKling: Как ** objectB.pointer ** ссылается на объект, если для объекта B установлено значение null? –

ответ

5

ли objectA.pointer ссылка или objectB.pointer ссылка все еще существует даже objectA и objectB устанавливаются null?

Да.

Возможно, какое-то искусство ASCII помогает. После выполнения

var objectA = {}; 
var objectB = {}; 

среда содержит две переменные (objectA и objectA), которые держат ссылки на два объекта (обозначенный как ref:XXX):

      +--------------+ 
+-------+---------+ +--->| Object#123 | 
|objectA|ref:123 *+--+ +--------------+ 
+-------+---------+      
|objectB|ref:456 *+--+ +--------------+ 
+-------+---------+ +--->| Object#456 | 
          +--------------+ 

После добавления свойств к Objets,

objectA.pointer = objectB; 
objectB.pointer = objectA; 

оба объекта имеют свойство pointer, каждая из которых содержит ссылку на другой объект:

      +-----------------+  
         | Object#123 |  
        +--->+-------+---------+<----+ 
+-------+---------+ | |pointer|ref:456 *+---+ | 
|objectA|ref:123 *+-+ +-------+---------+ | | 
+-------+---------+       | | 
|objectB|ref:456 *+-+ +-----------------+ | | 
+-------+---------+ | | Object#456 | | | 
        +--->+-------+---------+<--+ | 
         |pointer|ref:123 *+-----+ 
         +-------+---------+  

Как вы можете себе увидеть, что нет никакой связи между pointer собственности и objectA и objectB переменных. objectA.pointer не относится к переменной objectB, он получил копию своего значения (ref:456), ссылку на объект.

После установки обеих переменных null,

objectA = null; 
objectB = null; 

среда выглядит следующим образом:

      +-----------------+  
         | Object#123 |  
         +-------+---------+<----+ 
+-------+---------+  |pointer|ref:456 *+---+ | 
|objectA| null |  +-------+---------+ | | 
+-------+---------+       | | 
|objectB| null |  +-----------------+ | | 
+-------+---------+  | Object#456 | | | 
         +-------+---------+<--+ | 
         |pointer|ref:123 *+-----+ 
         +-------+---------+  

В pointer свойства до сих пор держат ссылки на другой объект. Замена значений objectA и objectB не изменила этого.

+0

О, прекрасное искусство ascii! Спасибо, это объясняется очень хорошо. Я ясно понимаю проблему сейчас. Я был слепым :) Еще раз спасибо –

1

Вам не о чем беспокоиться, JS - это управляемый язык и имеет встроенный Garbage Collector, который позаботится об этом случае. Подробнее читайте здесь: https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

То, что вы описываете, решается различными способами. Вы можете прочитать в этом вопросе How does Java Garbage Collection work with Circular References? о его реализации в Java.

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