в JavaScript, когда закончите с объектом, созданным через новый ActiveXObject, мне нужно установить его в нуль? - PullRequest
3 голосов
/ 29 апреля 2011

В программе Javascript, которая запускается в WSH и создает объекты, скажем, Scripting.FileSystemObject или любой произвольный COM-объект, нужно ли мне устанавливать переменную в null, когда я закончу с ней? Например, я рекомендую сделать это:

var fso = new ActiveXObject("Scripting.FileSystemObject");
var fileStream = fso.openTextFile(filename);
fso = null;  // recommended?  necessary? 
... use fileStream here ...
fileStream.Close();
fileStream = null;  // recommended? necessary?

Отличается ли эффект от того, чтобы просто позволить переменным выйти из области видимости?

Ответы [ 3 ]

5 голосов
/ 29 апреля 2011

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

Теоретически функция, использующая большой объект A в своем первом и другой большой объект B во второй части, может быть более эффективной в использовании памяти, если задано Aв ноль в середине.Но так как это не вынуждает ммс уничтожить А, утверждение все еще может быть пустой тратой.

Вы можете получить циклические ссылки, если вы сделаете какой-нибудь причудливый дизайн класса.Тогда может понадобиться разбить круг вручную - но, возможно, было бы лучше избежать таких циклов в первую очередь.

Ходят слухи о древних объектах доступа к базам данных с ошибками, которых можно было бы избежать путем переключения переменных.Я бы не стал основывать свои правила программирования на таком вуду.

(В интернете есть тонны кода VBscript, который полон "Set X = Nothing"; когда его спрашивают, авторы склонны говорить о "привычке"и другие языки (C, C ++)

1 голос
/ 30 апреля 2011

Основываясь на том, что сказал Ekkehard.Horner ...

Сценарии, такие как VBScript, JScript и ASP, выполняются в среде, которая управляет памятью для вас.Таким образом, явная установка ссылки на объект на Null или Empty не обязательно удаляет его из памяти ... по крайней мере, не сразу.(На практике это часто почти мгновенно, но на самом деле задача добавляется в очередь в среде, которая выполняется в более поздний момент времени.) В этом отношении она действительно намного менее полезна, чем вы думаете.

В скомпилированном коде важно очистить память перед завершением программы (или части кода в некоторых случаях), чтобы любая выделенная память возвращалась в систему.Это предотвращает все виды проблем.Вне медленно работающего кода это наиболее важно при выходе из программы.В средах сценариев, таких как ASP или WSH, управление памятью автоматически выполняет эту очистку при выходе из сценария.Таким образом, все ссылки на объекты для вас установлены на нуль, даже если вы сами этого не делаете явно, что делает ненужным весь беспорядок в этом случае.

Что касается памяти во время выполнения скрипта, если вы создаете массивыили объекты словаря, достаточно большие, чтобы вызывать проблемы, вы либо вышли далеко за рамки сценариев, либо выбрали неверный подход в своем коде.Другими словами, это не должно никогда происходить в VBScript.Фактически, среда налагает ограничения на размеры массивов и объектов словаря, чтобы в первую очередь предотвратить эти проблемы.

0 голосов
/ 30 января 2013

Если у вас есть долго работающие скрипты, которые используют объекты в начале / начале, которые не нужны во время основного процесса, установка этих объектов в null может быстрее освободить память и не причинит никакого вреда. Как упоминалось в других постерах, практической пользы может быть мало.

...