2009-05-15 1 views
4

Должен ли я освобождать выделенную память самостоятельно или есть какой-то сборщик мусора?Освобождение памяти, используемой объектами Javascript

Можно ли использовать следующий код JavaScript?

function fillArray() 
{ 
    var c = new Array; 
    c.push(3); 
    c.push(2); 
    return c; 
} 

var arr = fillArray(); 
var d = arr.pop() 

благодаря

+0

Что вы хотите сделать в этом примере? – Gumbo

ответ

8

Цитируется Apple JavaScript Coding Guidelines:

Использование ВЕЬЕТЕ. Всякий раз, когда вы создаете объект, используя новый оператор , соедините его с выводом . Это гарантирует, что все память, связанная с объектом, , включая его имя свойства, составляет для сбора мусора. ВЕИТ подробнее обсуждаются в «освободив объекты.»

Это говорит о том, что вы используете команду delete, чтобы затем позволить сборщику мусору освободить память, выделенную для Array, когда вы закончите использовать его , Дело в том, что оператор delete только удаляет ссылку, стоит отметить, что она отличается от поведения в C/C++, где нет мусора, а delete сразу освобождает память.

+3

Просто имейте в виду, что оператор «delete» фактически не «удаляет» объект - он просто удаляет ссылку на объект, так что сборщик мусора JavaScript может легко увидеть, что объект больше не используется. Для получения дополнительной информации см. Следующий вопрос: http://stackoverflow.com/questions/742623/deleting-objects-in-javascript. –

+0

@Steve: Хороший вопрос - я отредактирую сообщение. – Noldorin

+0

Оператор 'delete' удаляет свойство из объекта, поэтому он не работает с переменными. https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete – AlexJM

3

Переменные arr и d будут существовать как глобальные переменные и будут существовать до тех пор, пока они не будут собраны Сборщиком мусора.

переменных будет установлен как свойства глобального объекта, т.е. window в среде браузера, но так как они были объявлены с var, they will not be deletable from the global object.

В вашем конкретном случае, лучший курс действий может быть назначение null в переменные после того, как вы закончите с ними. Вы также можете подумать о том, чтобы скрыть свой объем функции и сделать то, что вам нужно сделать с ними внутри этой функции.

+0

Это неправильно. Переменные 'arr' и' d' не являются свойствами объекта, они являются переменными, поэтому они не могут быть удалены с помощью ключевого слова 'delete'. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete – AlexJM

+0

Я предлагаю назначить их чему-то еще. 'arr = null; d = null; ' – AlexJM

+0

@AlexJM Вероятно, попал в эту ловушку - http://perfectionkills.com/understanding-delete/#firebug_confusion. Рад обновить ответ и спасибо за указание! –

2

Управление памятью в JavaScript автоматическое и есть сборщик мусора (GC).

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

Вы не можете явно удалить переменные d и arr, но вы можете удалить ссылки на их значение, установив переменные в чем-то еще, например, null, чтобы позволить GC, чтобы удалить их из памяти.

arr = null; 
d = null; 

Обратите внимание, что ключевое слово delete удаляет только свойства объекта.