2010-07-21 6 views
5

Ich setze einen Breakpoint im Code unten, wo "Breakpoint" steht. Außerdem fügen Sie einen Überwachungsausdruck für dataStore hinzu.Firebug sagt mir irrigerweise, dass meine Variable nicht definiert ist

function(){ 
    var self = {}; 
    var dataStore = []; 
    var areEq = UNAB.objectsAreEqual; 

    self.put = function(key, value){ 
    /*breakpoint*/ dataStore.push({key:key, value:value}); 
    } 
    return self; 
} 

An diesem Haltepunkt, Firebug sagt mir "ReferenceError: dataStore ist nicht definiert". Gleiche Ergebnisse beim Versuch, "areEq" zu untersuchen. DataStore.push wird jedoch ohne Fehler ausgeführt. Eine zusätzliche Strangness: Das Hinzufügen eines Watch-Ausdrucks für "self" zeigt nicht das erwartete Self-Objekt, sondern eine Eigenschaft "put", aber das "window" -Objekt.

Irgendeine Idee, was zum Teufel ist los?

Antwort

1

Ich denke, das ist ein Firefox-Bug. Wenn Sie einen Haltepunkt auf setzen var dataStore = []; dann fortfahren, wenn Sie den Breakpoint in put() treffen. Sie erhalten einen Schließungsbereich (in Firebug 1.6). Dieser Bereich hat dataStore und self. Ich denke, Firefox optimiert den Closing-Bereich, vielleicht weil der Code sowieso Unsinn ist: Es gibt keine Möglichkeit, auf den DataStore zuzugreifen.

Ein vollständiger Testfall schließlich erscheint bei http://getfirebug.com/tests/script/stackoverflow/dataStoreIsNotDefined.html

auch https://developer.mozilla.org/en/DOM/window.self

+0

Danke für die Bestätigung, dass ich nicht verrückt bin (zumindest nicht auf diese besondere Weise). Und danke, dass du den Fehler gemeldet hast. – morgancodes

1

Wahrscheinlich self wird von Firebug und wahrscheinlich auch von Firefox im globalen Bereich als Bezug auf das aktuelle Fenster gelöst. Wenn Sie einen anderen Namen als "Selbst" wählen, sollte Ihr Code alle glücklich machen.

+0

sehen sind Sie richtig. 'window.self' ist das selbe wie' window'. Der OP-Code selbst ist perfekt korrektes JavaScript und wird ohne Fehler ausgeführt, aber es scheint, dass der Firebug-Debugger irgendwie den falschen Kontext hat, wenn er bricht. – casablanca

+0

Ich habe "Klassen" erstellt, mit var self {} seit über einem Jahr, viele Dutzend Male, und hatte nie ein Problem mit sich selbst. Ich werde etwas anderes versuchen. Vielen Dank! – morgancodes

+0

Ich habe "self" durch "_this" ersetzt und bekomme das gleiche Verhalten. Nervig! Seltsam! – morgancodes

Verwandte Themen