Это хорошая практика, чтобы установить переменные в нуль, когда они больше не нужны? - PullRequest
35 голосов
/ 25 августа 2011

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

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

var myValue;
.
.
.
myValue = null;

Ответы [ 4 ]

19 голосов
/ 25 августа 2011

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

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

var fn = function() {

   var local = 0;

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

}

var returned = fn();

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

jsFiddle .

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

19 голосов
/ 25 августа 2011

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

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

   // remove reference to element
   el = null;
}

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

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

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

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

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

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

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

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

3 голосов
/ 25 августа 2011

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

0 голосов
/ 12 мая 2015

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

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

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

После оценки переменного пароля сбросьте его на «».Если вы этого не сделаете, вы можете получить доступ к значению, выбрав любой из существующих элементов HTML, например кнопку, и используя элемент inspect для добавления кода атрибута

onclick = "javascript:alert(password);"

Сброс значения переменной пароля на ноль сохранит информацию о вашем пароле.сейф.

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