2012-03-26 12 views
0

Ich verwende eine alte Version von extjs, um meinen js-Code zu debuggen. Ich mache diesen Aufruf in meinem Code:Woher kommt das Speicherleck?

Ext.History.add("text"); 

Intern Ext.History wie dies umgesetzt wird:

Ext.History = (function() {/* code goes here. */ })(); 

Das Problem ist, dass Ext.History.add() aufgerufen wird ein Speicherleck auf IE verursacht. So übernehmen Ich möchte wahrscheinlich das Gehäuse zu verwenden stoppen und etwas tun, wie folgt aus:

function History() { 
    /* code */ 
} 
Ext.History = History; 

Aber dies führt zu Fehlern.

Edit: Der Fehler kam von der Add-Methode innerhalb des History-Objekts.

+1

Ich glaube nicht, dass Sie auf der richtigen Spur sind ... '(Funktion() {/ * Code geht hier. * /})();' Tatsächlich die Funktion (einmal) und das Ergebnis zurückgibt , anders als dein neuer Code. Wenn es ein Leck gibt, müsste es in der add() - Methode sein. – bhamlin

+0

@bhamlin Ich denke, du hast Recht. Ich habe meine Frage besser umgeschrieben. – Holtorf

Antwort

1

Welche Beweise haben Sie von einem Speicherleck? Die meisten wurden im IE behoben, es war sicherlich kein heißes Thema für ein paar Jahre. IE 6 und early IE 7 hatten Probleme mit zirkulären Referenzen, die DOM-Objekte beinhalteten, aber sie wurden ziemlich genau repariert, sogar in diesen älteren Versionen.

Wie auch immer, in der folgenden:

> Ext.History = (function() {/* code goes here. */ })(); 

der unmittelbar aufgerufen Funktionsausdruck (IIFE) auf der rechten Seite hat nur einen Verschluss an dem äußeren Umfang (die glbal Code zu sein scheint). Sie zeigen nicht, wo problematische Schließungen sind, daher ist es sehr schwierig zu kommentieren.

Vermutlich gibt die IIFE ein Objekt mit einer add Eigenschaft zurück, die eine Funktion ist, und diese Funktion hat eine Schließung zu Variablen, die im IIFE deklariert sind, z.

Sie können das ganze Ding durch ein Objekt und direkte Eigenschaften ersetzen, z. Folgendes wird wie die gleiche wie die oben scheinen, außer es Zugriff auf die Eigenschaften von Geschichte statt Schließungen:

Ext.History = { 

    foo: 'foo', 

    add: function (bar) { 
    return this.foo + ' ' + bar; 
    } 
}; 

Beachten Sie, dass die dieser Wert von müssen hinzufügen Geschichte (zB nennen es sein wie Ext.History.add()) sonst wird es nicht funktionieren. Variablen mit gleichen Namen wie aktuelle Eigenschaften müssen neue Namen erhalten.

Wenn Sie den gesamten Code (oder einen vernünftigen Chunk, der das Muster zeigt) veröffentlichen, ist möglicherweise eine Fehlerbehebung möglich. Alternativ können Sie nach neuen Versionen suchen und sehen, was sie getan haben, um das Problem zu beheben.