2010-07-21 2 views
5

Sto impostando un punto di interruzione nel codice sottostante dove si dice "breakpoint". Aggiunta anche di un'espressione di controllo per dataStore.firebug mi dice erroneamente che la mia variabile non è definita

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

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

In questo punto di interruzione, Firebug mi dice "ReferenceError: dataStore non è definito". Stessi risultati con il tentativo di esaminare "areEq". Tuttavia, dataStore.push viene eseguito senza errori. Un ulteriore stranezza: aggiungere un'espressione watch per "self" mostra non l'oggetto self che mi aspetto, con una proprietà, "put", ma l'oggetto "window".

Qualche idea su cosa diavolo sta succedendo?

risposta

1

Penso che questo sia un bug di Firefox. Se si imposta un punto di interruzione su var dataStore = []; quindi continuare, quando si preme il punto di interruzione in put(). ottieni un ambito di chiusura (in Firebug 1.6). Tale ambito ha dataStore e self. Penso che Firefox stia ottimizzando lo scope di chiusura, forse perché il codice non ha senso comunque: non c'è modo di accedere a dataStore.

Un banco di prova completa finirà per apparire in http://getfirebug.com/tests/script/stackoverflow/dataStoreIsNotDefined.html

vedi anche https://developer.mozilla.org/en/DOM/window.self

+0

Grazie per aver confermato che non sono pazzo (almeno non in questo modo particolare). E grazie per aver segnalato il bug. – morgancodes

1

Probabilmente self viene risolto da Firebug e probabilmente anche da Firefox nell'ambito globale come riferimento alla finestra corrente. Se scegli un nome diverso da "self", il tuo codice dovrebbe rendere tutti felici.

+0

Sei corretta. 'window.self' è lo stesso di' window'. Il codice dell'OP stesso è perfettamente corretto JavaScript e verrà eseguito senza errori, ma sembra che il debugger di Firebug abbia in qualche modo il contesto sbagliato quando si rompe. – casablanca

+0

Sto creando "classi", usando var self- {} per oltre un anno, molte dozzine di volte, e non ho mai avuto problemi con se stessi. Proverò qualcos'altro però. Grazie! – morgancodes

+0

Ho sostituito "self" con "_questo" e ho ottenuto lo stesso comportamento. Fastidioso! Strano! – morgancodes