1. Что такое закрытие, и цепочка применения, участвующая в закрытии, не будет обсуждаться здесь.
2. Механизм сбора мусора JavaScript
JavaScript не нуждается в свободной памяти вручную, он использует автоматический механизм сбора мусора. Когда объект бесполезен, то есть, когда ни одна переменная в программе относится к объекту, переменная будет выпущена из памяти.
Кода -копия выглядит следующим образом:
var s = [1, 2,3];
var s = null;
// таким образом будет выпущен оригинальный массив [1, 2, 3].
3. переработка цитирования
Три объекта a, b, c
Aàbàc: Определенный атрибут относится к B, и C также ссылается на атрибут B. Если A очищено, то B и C также выпускаются.
Aàbàcàb: определенный атрибут C добавляется здесь для обозначения объекта B. Если это так, чтобы очистить A, то B и C не будут выпущены, потому что между B и C. генерируется круговая ссылка между B и C.
Кода -копия выглядит следующим образом:
var a = {};
A.pro = {a: 100};
A.pro.pro = {b: 100};
a = null;
// В этом случае {a: 100} и {b: 100} также выпускаются одновременно.
var obj = {};
obj.pro = {a: 100};
obj.pro.pro = {b: 200};
var two = obj.pro.pro;
obj = null;
// В этом случае {b: 200} не будет выпущен, а {a: 100} будет выпущено.
4. Утилизация ссылок и закрытия
Кода -копия выглядит следующим образом:
Функция Outter () {
var obj = {};
функция inner () {
// здесь ссылается объект OBJ
}
obj.inner = inner;
}
Это своего рода и скрытая круговая ссылка. Когда наружу называется один раз, внутри него создаются два объекта obj и inner. Внутренняя собственность OBJ относится к внутреннему; Аналогичный внутренний также относится к OBJ, потому что OBJ все еще находится в закрытой среде Innerfun. Чтобы быть точным, это связано с уникальной «цепочкой применения» JavaScript.
Следовательно, закрытие очень легко создавать круговые ссылки, и, к счастью, JavaScript может очень хорошо справляться с такими круговыми ссылками.
5. Утечка памяти в т.е.
В IE есть несколько утечек памяти, и здесь есть подробное объяснение (http://msdn.microsoft.com/en-us/library/bb250448.aspx).
Здесь обсуждается только один из них, а именно утечки памяти, вызванные круговыми ссылками, потому что это самая распространенная ситуация.
Когда существует ссылка на цикл между элементом DOM или объектом ActiveX и обычным объектом JavaScript, IE имеет особые трудности в выпуске таких переменных. Лучше всего разрезать ссылку на петлю. Эта ошибка была исправлена в IE 7 (http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).
«IE 6 пострадал от утечек памяти, когда была создана круговая ссылка между несколькими объектами, среди которых, по крайней мере, одним узлом DOM. Эта проблема была решена в IE 7.»
Если OBJ в приведенном выше примере (точке 4) ссылается не на объект функции JavaScript (внутренний), а объект ActiveX или элемент DOM, циркулярная ссылка, сформированная в IE, не может быть выпущена.
Кода -копия выглядит следующим образом:
function init () {
var elem = document.getElementById ('id');
elem.onclick = function () {
блюд («дождь»);
// элемент Elem упоминается здесь
};
}
Elem ссылается на функцию прослушивания событий Click, а функция также ссылается на элемент Elem через цепочку сфера. Таким образом, даже если вы оставите текущую страницу в IE, эти круговые ссылки не будут выпущены.
6. Решение
Основной метод заключается в том, чтобы вручную очистить эту круговую ссылку. Ниже приведен очень простой пример. При его использовании вы можете построить функцию addevent () самостоятельно и очистить все привязки событий в событии разгрузки окна.
Кода -копия выглядит следующим образом:
Функция Outter () {
var One = document.getElementById ('One');
One.onClick = function () {};
}
window.onunload = function () {
var One = document.getElementById ('One');
one.onclick = null;
};
Другие методы (от: Дуглас Крокфорд)
Кода -копия выглядит следующим образом:
/**
* Итерация через определенный узел элемента и все элементы потомков
*
* @param elem Узел Узел элемента, который будет очищен
* @param function function функция для обработки
*
*/
Функция warhthedom (узлы, фанк) {
Func (узел);
node = node.firstchild;
while (node) {
Уочныйем (Узел, Функция);
node = node.nextibling;
}
}
/**
* Очистите все ссылки из узла DOM, чтобы предотвратить утечку памяти
*
* @param elem Узел Узел элемента, который будет очищен
*
*/
Функция чистка
WALKTHEDOM (Узел, Функция (e) {
для (var n in e) {
if (typeof e [n] ===
'function') {
e [n] = null;
}
}
});
Выше приведено соответствующее содержание и решения для утечек памяти JavaScript. Друзья, которые это нужно, могут ссылаться на это.