22 Stimmen

Javascript + Firebug : "cannot access optimized closure" Was bedeutet das?

Ich habe gerade den folgenden Fehler in einem Stück von Javascript (in Firefox 3.5, mit Firebug läuft)

cannot access optimized closure

Oberflächlich betrachtet weiß ich, was den Fehler verursacht hat. Ich hatte eine Zeile

options.length() 

anstelle von

options.length

Durch die Behebung dieses Fehlers ist die Meldung verschwunden. Aber ich bin neugierig. Was hat das zu bedeuten? Was ist eine optimierte Schließung? Ist das Optimieren einer Schließung etwas, das der Javascript-Interpreter automatisch tut? Was macht er?

1voto

c.cobb Punkte 11

Dies kann auch durch eine einfache Race Condition verursacht werden. Ich war gerade dabei, ein "Startup"-Objekt zu überarbeiten, das ein paar Dinge tut, bevor das Dokument fertig ist. Sobald ich versuchte, auf ein zweites Objekt zuzugreifen, das direkt unter dem Startobjekt definiert ist, erhielt ich diesen Fehler.

Ich hatte den Eindruck, dass die Skriptausführung wartet, bis der gesamte Code kompiliert ist. Das ist eindeutig nicht der Fall. Das Problem wurde behoben, indem man wartete, bis das Dokument bereit war, die Methoden des zweiten Objekts aufzurufen. Außerdem bestätigt die Verwendung dieser netten 'dump()'-Funktion, dass das zweite Objekt nur teilweise definiert ist, wenn der Fehler auftritt: http://www.openjs.com/scripts/others/dump_function_php_print_r.php

0voto

Bryan Matthews Punkte 1108

Ich bin heute auf denselben Fehler gestoßen. In meinem Fall trat dieser Fehler auf, weil ich auf ein Attribut oder eine Funktion eines Objekts verwies, die nicht existierte oder nicht verfügbar war. Ich vermute, dass, da das Objekt über eine optimierte Schließung verfügbar war, Firebug nicht auf die Metadaten dieses Objekts zugreifen konnte und daher die kryptische Fehlermeldung.

0voto

spthorn Punkte 19

Das ist mir heute auch passiert. Firebug hat in Zeile 2 dieser Funktion einen Fehler angezeigt:

function IsValidDate(objName) {
  re = new RegExp('^( +|today|pdate|- \*\\\\d+ \*(day(s|)|week(s|))+ \*$', 'i');
  if (re.test(objName.value)) return 2;
  return (chkdate(objName));
}

Als ich "var " vor der Deklaration von "re" in Zeile 1 hinzufügte, verschwand der Fehler.

0voto

resopollution Punkte 17760

Es gibt eine Ausnahme, die irgendwo anders in Ihrem Code innerhalb der Funktion ausgelöst wird, die diesen Fehler hat. Es könnte ein einfacher Versuch sein, auf eine Variable zuzugreifen, die nicht existiert.

Ich denke, wir brauchen einen Firebug-Entwickler hier, um zu beantworten, warum es nicht einen genaueren Fehler, wo in der Schließung, die die Ausnahme, um den Fehler auffordern ausgelöst.

Sie haben options.length() eingefügt, aber das ist nicht die Ursache des Fehlers. Was den Fehler verursacht hat, ist die Tatsache, dass Ihr Fehler innerhalb einer Schließung war.

function(){
    array.length()
}

die den Fehler verursacht

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X