Как правильно обрабатывать объекты JavaScript, на которые ссылается одна переменная? - PullRequest
0 голосов
/ 11 августа 2011

У меня есть случай, когда в моем JavaScript есть переменная, которая будет использоваться для хранения ссылки на несколько экземпляров класса.Класс создает окно на основе div, вроде лайтбокса, и затем, когда я вызываю метод removeWindow класса, элементы окна div удаляются из DOM.Так что последовательность может быть такой:

var divWindow = null;
divWindow = new DivWindowClass(...);
/* do some stuff with the window */
divWindow.removeWindow();

Позже в коде я снова создаю окно с другим содержимым, но я также хочу иметь возможность проверить, ссылается ли переменная divWindow на что-либо.*

Правильно ли просто:

divWindow.removeWindow();
divWindow = null;

if (divWindow == null) { /* etc. */ }

/* later in the code */
divWindow = new DivWindowClass(...); /* with different content than first one */

или это вызывает проблемы с памятью при сборке мусора JavaScript?Если я установлю для divWindow значение null, будет ли это сигнализировать сборщику мусора собирать мой объект и избавиться от него, или мне нужно еще кое-что сделать, чтобы привести в порядок?!

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Ну, это зависит.Если у вас есть функция, определенная или выраженная, например, под divWindow, это будет означать, что divWindow считается достижимым сборщиком мусора, по крайней мере, до тех пор, пока эта функция существует.В этом случае установка divWindow в null фактически приведет к тому, что GC очистит его в следующем цикле.Однако, если это не так, «обнуление» переменной не поможет ей больше, чем обычно.Если бы вы опубликовали весь код, я мог бы рассказать вам больше.

Нет явного способа освободить память в javascript.Лучшее, что вы можете сделать, - это знать обо всех ссылках на ваш объект, знать, насколько он достижим, и убедиться, что объект недоступен, когда он вам больше не нужен.После этого, в конечном счете, вы должны научиться доверять сборщику мусора, что не так просто, когда вы кодируете что-то, что вы хотите запустить в IE, например.

(пс:хочу исключить комментарий, сделанный выше. Оператор delete предназначен для удаления свойств из объекта. Он не «удаляет» переменные и не освобождает память. На самом деле, если вы это сделаете, javascript выдает1006 * в строгом режиме.)

0 голосов
/ 11 августа 2011

Первое решение хорошо.Это будет сигнализировать сборщику мусора, но это бесконечно мало того, сколько может занять сборщик мусора.

...