2015-05-20 2 views
-1

Если у меня есть следующий код:У анонимных объектов JavaScript есть память?

var a = {a:1,b:2,c:3} ['a'] 
var b = {a:1,b:2,c:3} ['b'] 

я создал два объекта анонимного JavaScript. У меня есть объекты анонимного JavaScript? Или они сразу собирают мусор?

+4

Все занимает память. Затем он освобождается, а спустя некоторое время собирают мусор.Сбор мусора зависит от реализации (например, механизма javascript, используемого в конкретном браузере) и поэтому не может быть угадан. Не беспокойтесь об этом, просто используйте их по мере необходимости. –

+2

Это деталь реализации. Я бы предположил, что большинство современных двигателей оптимизируют объект, учитывая этот простой пример. Есть ли у вас более реальный пример? –

+0

@squint * Could * .. не так уверен, что «делай», поскольку это довольно редкий случай использования. (Но есть некоторые * впечатляющие * front-end оптимизации). – user2864740

ответ

2

Каждый анонимный объект должен существовать, пока он используется для поиска свойств, поэтому в это время требуется память. После того, как поиск свойств закончен, больше ничего не используется, поэтому он становится мусором.

Нет никакой гарантии, что когда мусор действительно будет собрал, так что возможно (и, вероятно), что объекты все еще существуют в памяти после того, как эти линии запущены. Но они имеют право на сборку мусора и собираются в какой-то момент в будущем, когда движку JavaScript необходимо освободить память для других данных.

0

Ниже приведен пример того, как работает сбор мусора, аналогичный вашему вопросу, вы заметите, что o2.a похож на ваш сценарий. Также отмечается, что, поскольку часть объекта все еще используется, вся переменная все еще используется.

var o = { 
    a: { 
    b:2 
    } 
}; 
// 2 objects are created. One is referenced by the other as one of its property. 
// The other is referenced by virtue of being assigned to the 'o' variable. 
// Obviously, none can be garbage-collected 


var o2 = o; // the 'o2' variable is the second thing that 
      // has a reference to the object 
o = 1;  // now, the object that was originally in 'o' has a unique reference 
      // embodied by the 'o2' variable 

var oa = o2.a; // reference to 'a' property of the object. 
       // This object has now 2 references: one as a property, 
       // the other as the 'oa' variable 

o2 = "yo"; // The object that was originally in 'o' has now zero 
      // references to it. It can be garbage-collected. 
      // However what was its 'a' property is still referenced by 
      // the 'oa' variable, so it cannot be free'd 

oa = null; // what was the 'a' property of the object originally in o 
      // has zero references to it. It can be garbage collected. 

В общем, я бы сказал, да, они все еще занимают память.

Однако я также подозреваю, что многие браузеры были бы достаточно умны, чтобы понять, что вы только создали объект на этой линии и присвоили ему только часть, поэтому не было бы причин держать весь объект, и может удалить его. Но в целом эта память используется до тех пор, пока переменная a или b находится вокруг.

0

Выражение «анонимный объект JavaScript» немного странно. Объекты JavaScript - это просто объекты и не имеют имен сами по себе. К ним могут относиться или не ссылаться другие вещи, включая, но не ограничиваясь ими, переменные, которым они были назначены. Например, рассмотрим следующий случай:

function make_getter(obj) { return function(p) { return obj[p]; }; } 

var getter = make_getter({a: 1}); 

Здесь {a: 1} является «анонимным», но его называют, в силу того накрыла, в функции, возвращаемый make_getter и присвоенного getter, Покуда getter все еще находится в сфере охвата, поэтому объект не может (и не будет) собираться мусором.

Независимо от того, связан ли объект с мусором, связан ли он с ссылкой на какой-либо контекст в реальном времени, а не только на то, назначен ли он переменной. он может быть назначен переменной, но вышел из сферы действия; или он может не назначаться переменной, но сохраняться в некоторой области.

Как упоминалось в других сообщениях, фактический GC происходит, когда и если двигатель чувствует себя так, и вам не нужно или не нужно его контролировать.

Иначе говоря, эти два фрагмента ниже идентичны с точки зрения GC:

function gc1() { 
    return {a:1, b:2, c:3}['a']; 
} 

function gc2() { 
    var o = {a:1, b:2, c:3}; 
    return o['a']; 
} 

Никто не заботится случилось ли вам дали имя o к объекту. Вопрос в том, когда он выходит за рамки, что в этом случае происходит в конце функции.

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