Christian S.: IE Memory Leak vermeiden

Beitrag lesen

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);
  };
};