Является ли хорошей практикой устанавливать переменные в null, когда они больше не нужны?
Я видел значения javascript, установленные в null
в конце функции.
Это делается для сокращения использования памяти или только для предотвращения случайного использования в другом месте?
Есть ли хороший пример для этого. Если так, когда?
var myValue;
.
.
.
myValue = null;
Ответы
Ответ 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/