Возникла проблема с 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-узлов. Но, вероятно, это хорошая привычка удалять ссылки на объекты в замыканиях, где они не нужны.