2010-10-20 3 views

ответ

3

Да, это так. Это не в области b(), но оно находится в памяти.

Вы не можете просто магически удалить объекты с областью a(). Вы можете вручную delete a;, если вам не нужно будет его больше, но самый лучший и самый разумный способ сделать это, называя их один за другим, вместо вложенных вызовов:

function a() { 
    var a = 123; 
    //some stuff 
} 

function b() { 
    //some stuff 
} 

a(); 
b(); 

Если нет быстрый способ сделать это, подумайте о рефакторинге своего кода немного

+0

Вы знаете какой-либо способ автоматического выпуска вместо обнуления каждой переменной? – Ozgur

+0

@Ozgur: он должен быть выпущен автоматически в несколько случайной точке после завершения 'a'. Javascript - сборщик мусора, что означает, что если у вас больше нет дескриптора переменной, он в конечном итоге будет очищен. –

+2

Оператор 'delete' действительно не работает для этого случая, как вы рекомендуете. С помощью 'FunctionDeclaration', как' a' в вашем примере, 'delete a;' будет терпеть неудачу, потому что идентификатор привязан к * переменному объекту * как * не подлежащий удалению *, ('{DontDelete}' в ECMAScript 3, или '[[Configurable]] = false'), кроме того, в новом строком режиме ECMAScript 5 Edition, удаление идентификатора (например,' delete a; ') вызовет' SyntaxError', это было сделано из-за большого недоразумения этого оператор ... Больше информации: [Понимание 'delete'] (http://perfectionkills.com/understanding-delete/). – CMS

1

Это будет как конкретная реализация, так и конкретная программа. Это будет зависеть от конкретной платформы javascript, на которой он работает, таких как размер системной памяти и количество кода/сколько переменных было выделено до того, как был запущен a().

Вы не можете полагаться на то, что он был освобожден до или во время b(), поскольку сбор мусора является недетерминированным.

В большинстве случаев он, вероятно, останется в памяти.

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