2012-03-15 4 views
0

Рассмотрите этот многоуровневый вложенный объект JavaScript.сбор мусора в Javascript

function foo() { 
    var channels = { 
     2: { 
      name: "station 1", 
      description: "station1", 
      img: ["img1-a", "img1-b", "img1-c"] 
     }, 
     3: { 
      name: "station 2", 
      description: "station2", 
      img: ["img2-a", "img2-b", "img2-c"] 
     }, 
     4: { 
      name: "station 3", 
      description: "station3", 
      img: ["img3-a", "img3-b", "img3-c"] 
     }, 
    }; 

    console.log(channels);   
};   
....     
// calling foo. 
foo(); 

После функции foo() вернется, все вложенные объекты (т.е. отдельные объекты канала, строки в массив IMG и строк в IMG массив, все будет автоматически сборщиком мусора?

Или, нужно ли мне явно перебирать и «удалить» каждый объект?

+2

Нет ссылки на любой из этих объектов/массивов, поэтому в конечном итоге они будут собраны в мусор. –

+0

См. Http://stackoverflow.com/questions/864516/what-is-javascript-garbage-collection – j08691

+0

@FelixKling: спасибо за быстрый ответ. – Karthik

ответ

2

Зависит от того, что происходит в console.log. Конечно, в Chrome ссылка на объект channels хранится в консоли, поэтому channels не может быть GC'd.

Когда вы удалите console.log, полный объект channel будет надлежащим образом GC'd, потому что на нем нет других ссылок.

+1

для дополнительной ясности. Я не думал о console.log. Итак, если бы я должен был ссылаться на вышеупомянутые «каналы» в закрытии, я предполагаю, что память будет собираться мусором, как только будет освобождена ссылка на _closure_? Я прав? – Karthik

2

Они имеют право на GC до тех пор, как ничто другое ссылается их.

0

Они должны быть, да, потому что больше нет ссылки на этот объект channels или на его закрытие.

GC в основном зависит от браузера, который его реализует, поэтому нет гарантии, что это действительно будет сделано. delete Однако каждый элемент переполнен.

+0

спасибо, что я пошел с ответом Роба, из-за дополнительной информации о console.log. – Karthik

0

Javascript имеет свой сборщик мусора, реализованный движком браузера (v8 или что-то еще). Вам не нужно отменять ссылки. Как только корень выходит из сферы действия, все они будут иметь право на gc.