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?

4voto

Ich hatte dieses Problem auch, wenn Firebug ausgeführt wird.

Es scheint manchmal zu passieren, wenn eine Ausnahme ausgelöst wird (aus welchem Grund auch immer) und wenn es irgendwo im Aufrufstapel einen rekursiven Funktionsaufruf gibt. Die Ausnahme wird als mysteriöser "InternalError: cannot access optimized closure" erneut ausgelöst.

Wenn ich die Art und Weise, wie ich die rekursive Funktion definiere, ändere, scheint dieses Problem zu verschwinden, z. B. wenn ich von

function foo(bar) {... foo(recursively); ...}

zu

var foo = function(bar) {... foo(recursively); ...}

Ich hoffe, das hilft.

3voto

avernet Punkte 29755

Es handelt sich um einen Fehler in Firefox, der bei geöffnetem Firebug auftritt:

https://bugzilla.mozilla.org/show_bug.cgi?id=505001

[In einer früheren Antwort wurde erwähnt, dass dies auf folgende Gründe zurückzuführen ist dieser andere Fehler was meiner Meinung nach falsch ist, da das andere Problem nicht mit Firebug zusammenhängt].

1voto

Luca Matteis Punkte 28819

Scheint ein Firefox-Fehler zu sein: https://bugzilla.mozilla.org/show_bug.cgi?id=496790

1voto

davenpcj Punkte 12248

Ein Abschluss ist eine Funktion mit Kontext. Wenn Sie dynamisch eine neue Funktion erstellen, dann erstellen Sie eine Schließung.

function makeAdder(int num) {
    return function(int num2) { return num + num2; }
}

adder = makeAdder(5);
adder(7) // returns (5+7) = 12
adder(2) // returns (5+2) = 7

Hier ist der Abschluss die innere Funktion, wie sie von makeAdder zurückgegeben wird, zusammen mit der übergebenen "5".

Die Javascript-Engine könnte sich dafür entscheiden, die oben gezeigte Funktion zu optimieren, damit die Dinge schneller ablaufen, und diesen Code nie generieren oder ausführen, so dass er nicht debuggt oder referenziert werden kann. Optimierer sollen sehr vorsichtig sein, um sicherzustellen, dass es keine Auswirkungen, so würde ich vermuten, diese einen Fehler gemacht.

1voto

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