Christian S.: IE Memory Leak vermeiden

Hi,

ich erweitere ein DOM Objekt mit einer eigenen Funktion:

var o = document.getElementById("test");
o.myFnc = function()
{
//...
};

mein Tool zum erkennen von Memory Leaks zeigt mir an, dass das DOM objekt leakt.

hat jmd eine Idee wie ich das vermeiden kann?

Habe mal gelesen, dass es hilft, wenn man eine Funktion drum macht und die funktion außerhalb definiert:

var t = function()
{
//...
};
(function(){
o.myFnc = t;
})();

klingt doof, da man noch mehr Closures verwendet, aber in einem anderen Stück code ging das schon mal...
hier jedoch tut sich da nichts.

Gruß
Christian

  1. hi,

    mein Tool zum erkennen von Memory Leaks

    Welches nutzt du da - Drip?

    zeigt mir an, dass das DOM objekt leakt.

    hat jmd eine Idee wie ich das vermeiden kann?

    Der MSDN-Artikel Understanding and Solving Internet Explorer Leak Patterns und Memory Leakage in Internet Explorer - revisited betrachten das Problem sehr detailiert.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hi,

      jo genau, Drip benutze ich.

      bei MSDN nutzen sie alle die onunload methode.... schön ist das ja nicht...

      Gruß
      Christian

    2. Das hier ist ja echt cool... das klappt:

      Function.prototype.closure = function(obj)
      {
        // Init object storage.
        if (!window.__objs)
        {
          window.__objs = [];
          window.__funs = [];
        }

      // For symmetry and clarity.
        var fun = this;

      // Make sure the object has an id and is stored in the object store.
        var objId = obj.__objId;
        if (!objId)
          __objs[objId = obj.__objId = __objs.length] = obj;

      // Make sure the function has an id and is stored in the function store.
        var funId = fun.__funId;
        if (!funId)
          __funs[funId = fun.__funId = __funs.length] = fun;

      // Init closure storage.
        if (!obj.__closures)
          obj.__closures = [];

      // See if we previously created a closure for this object/function pair.
        var closure = obj.__closures[funId];
        if (closure)
          return closure;

      // Clear references to keep them out of the closure scope.
        obj = null;
        fun = null;

      // Create the closure, store in cache and return result.
        return __objs[objId].__closures[funId] = function ()
        {
          return __funs[funId].apply(__objs[objId], arguments);
        };
      };

      1. und das hier wohl noch besser:
        klappt auch.

        Function.prototype.closure = function() {
            if(!window.__funcs) window.__funcs = [];
         window.__funcs.push(this);
            return function () {
         return window.__funcs[window.__funcs.length - 1].apply(null, arguments);
            };
        };

        Gruß!

        1. Hallo Christian,

          magst Du schreiben, wie diese Closure-Definition implementiert wird? Ich habe auch Probleme mit Memory-Leaks unter IE und bin drauf und dran, alle Closures durch globale Funktionen zu ersetzen. Vielleicht gibt es ja doch noch eine bessere Möglichkeit.

          Gruß
          Olaf