Подтвердить что ты не робот

Является ли хорошей практикой устанавливать переменные в null, когда они больше не нужны?

Я видел значения javascript, установленные в null в конце функции. Это делается для сокращения использования памяти или только для предотвращения случайного использования в другом месте?

Есть ли хороший пример для этого. Если так, когда?

var myValue;
.
.
.
myValue = null;
4b9b3361

Ответ 1

Нечего было бы менять локальную переменную на null в конце функции, потому что она будет удалена из стека, когда она вернется в любом случае.

Однако внутри замыкания переменная не будет освобождена.

var fn = function() {

   var local = 0;

   return function() {
      console.log(++local);
   }

}

var returned = fn();

returned(); // 1
returned(); // 2

jsFiddle.

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

Ответ 2

Возникла проблема с iE и круговыми ссылками с элементами DOM. Обычно это было создано при подключении слушателей следующим образом:

function doStuff() {
   var el = document.getElementById('someID');
   el.onclick = function() {
     // has closure to el
   };

   // remove reference to element
   el = null;
}

Когда doStuff ia вызывается, анонимная функция, присоединенная к элементу, имеет замыкание назад к элементу - циклическую ссылку. В более старых версиях IE это вызвало утечку памяти, поэтому решение заключалось в том, чтобы установить el в значение null (или что-то другое, кроме el), чтобы разбить круговую ссылку после назначения на el.onclick.

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

var someFunction = (function() {
  var x = reallyBigObject;
  // do stuff that uses reallyBigObject

  // Remove reference to reallyBigObject if it no longer required
  x = null;

  return function() {
    // closure to x is unavoidable, but reference to reallyBigObject isn't required
  }
}());

Итак, если функция, возвращаемая в someFunction, на самом деле не нуждается в ссылке на realBigObject, тогда ссылка может быть удалена, поэтому закрытие не избавит ее от ненужного сбора мусора.

Обратите внимание, что вы не можете предотвратить закрытие переменных в области видимости, но вы можете изменить их значения.

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

Ответ 3

Нет, это не так. Каждая локальная переменная удаляется после окончания функции.

Ответ 4

Да, очень. Особенно, если переменная имеет некоторую секретную информацию, такую ​​как возвращенный пароль.

Как только вы используете переменную, объявите ее как null или "", потому что активные переменные в js могут быть прочитаны с помощью элемента проверки.

var password = $('#password').val();

После оценки переменной password reset это значение "". Если вы не можете получить доступ к этому значению, выберите любой из ваших существующих элементов html, таких как кнопка, и с помощью элемента проверки добавьте код атрибута

onclick = "javascript:alert(password);"

Сброс пароля переменной до нуля приведет к сохранению информации о вашем пароле.

var password = $('#password').val();
//do what you want to do with variable password
password = null;

Ответ 5

Объекты уничтожаются (и их память free'd) с оператором delete.

var myValue = new Object;
delete myValue;
// myValue will now be undefined

Работает также для неперечисленных переменных: [edit] Ну, ошибочно.

Прочтите этот документ для получения дополнительной информации об удалении: http://perfectionkills.com/understanding-delete/