1. O que é um fechamento e a cadeia de escopo envolvida no fechamento não será discutida aqui.
2. Mecanismo de coleta de lixo JavaScript
O JavaScript não precisa de memória livre manualmente, ele usa um mecanismo automático de coleta de lixo. Quando um objeto é inútil, ou seja, quando nenhuma variável no programa se refere ao objeto, a variável será liberada da memória.
A cópia do código é a seguinte:
var s = [1, 2,3];
var s = nulo;
// Dessa forma, a matriz original [1, 2, 3] será lançada.
3. Citação de reciclagem
Três objetos a, b, c
Aàbàc: um certo atributo de a refere -se a b e c também é referenciado pelo atributo de B. Se A for limpo, B e C também serão liberados.
Aàbàcàb: Um certo atributo de C é adicionado aqui para se referir ao objeto B. Se for para limpar a, então B e C não serão liberados porque uma referência circular é gerada entre B e C.
A cópia do código é a seguinte:
var a = {};
a.pro = {a: 100};
a.pro.pro = {b: 100};
a = nulo;
// Nesse caso, {a: 100} e {b: 100} também são lançados ao mesmo tempo.
var obj = {};
obj.pro = {a: 100};
obj.pro.pro = {b: 200};
var dois = obj.pro.pro;
obj = nulo;
// Neste caso, {b: 200} não será lançado, enquanto {a: 100} será lançado.
4. Referências e fechamentos de reciclagem
A cópia do código é a seguinte:
função outer () {
var obj = {};
função interna () {
// O objeto OBJ é referenciado aqui
}
obj.inner = interno;
}
Esta é uma espécie de referência circular oculta e oculta. Quando o exterior é chamado uma vez, dois objetos OBJ e internos são criados dentro dele. A propriedade interna da OBJ refere -se ao interior; Interior semelhante também se refere ao OBJ, porque o OBJ ainda está no ambiente fechado do Innerfun. Para ser preciso, isso se deve à "cadeia de escopo" exclusiva do JavaScript.
Portanto, os fechamentos são muito fáceis de criar referências circulares, e felizmente o JavaScript pode lidar com essas referências circulares muito bem.
5. vazamento de memória no ie
Existem vários vazamentos de memória no IE, e há uma explicação detalhada aqui (http://msdn.microsoft.com/en-us/library/bb25048.aspx).
Apenas um deles é discutido aqui, a saber, vazamentos de memória causados por referências circulares, porque essa é a situação mais comum.
Quando existe uma referência de loop entre um elemento DOM ou um objeto ActiveX e um objeto JavaScript normal, o IE tem dificuldades especiais na liberação dessas variáveis. É melhor cortar manualmente a referência de loop. Este bug foi corrigido no IE 7 (http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).
“O IE 6 sofria de vazamentos de memória quando uma referência circular entre vários objetos, entre os quais pelo menos um nó DOM, foi criada. Esse problema foi resolvido no IE 7.”
Se o OBJ no exemplo acima (ponto 4) faz referência a um objeto de função JavaScript (interno), mas um objeto ActiveX ou elemento DOM, a referência circular formada no IE não poderá ser liberada.
A cópia do código é a seguinte:
function init () {
var elem = document.getElementById ('id');
elem.onClick = function () {
Alerta ('Rain-Man');
// O elemento elem é referenciado aqui
};
}
A Elem refere -se à função de escuta do evento de clique, e a função também faz referência ao elemento Elem por meio de sua cadeia de escopo. Dessa forma, mesmo se você deixar a página atual no IE, essas referências circulares não serão lançadas.
6. Solução
O método básico é limpar manualmente essa referência circular. A seguir, é um exemplo muito simples. Ao usá -lo, você pode criar um addEvent () funcionar você mesmo e limpar todas as ligações de eventos no evento de descarga da janela.
A cópia do código é a seguinte:
função outer () {
var one = document.getElementById ('One');
One.OnClick = function () {};
}
window.onunload = function () {
var one = document.getElementById ('One');
One.OnClick = NULL;
};
Outros métodos (por: Douglas Crockford)
A cópia do código é a seguinte:
/**
* Itera através de um certo nó de elemento e todos os elementos descendentes
*
* @param elem node o nó do elemento a ser limpo
* Função @param função função para processamento
*
*/
função walkthedom (nó, func) {
func (nó);
node = node.firstChild;
while (nó) {
walkthedom (nó, func);
node = node.nextsibling;
}
}
/**
* Limpe todas as referências do nó DOM para impedir o vazamento de memória
*
* @param elem node o nó do elemento a ser limpo
*
*/
função purgeeventHandlers (nó) {
walkthedom (nó, função (e) {
para (var n em e) {
if (typeof e [n] ===
'função') {
e [n] = nulo;
}
}
});
O acima é o conteúdo e as soluções relevantes para vazamentos de memória JavaScript. Amigos que precisam podem se referir a ele.