Sto cercando uno bug in un'estensione FireFox. Sono finalmente riuscito a vederlo da solo (ho avuto solo rapporti prima) e non riesco a capire come sia possibile ciò che ho visto.Oggetti in JavaScript definiti e indefiniti allo stesso tempo (in un'estensione FireFox)
Un messaggio di errore dalla mia estensione nella console degli errori è "gBrowser non è definito". Questo di per sé sarebbe abbastanza sorprendente, poiché l'overlay è su browser.xul e navigator.xul, e mi aspetto che gBrowser
sia disponibile da entrambi. Ancora peggio è il luogo in cui si verifica: riga 101 di nextplease.js. Cioè, all'interno della funzione isTopLevelDocument
, che viene chiamato solo da onContentLoaded
, che viene chiamato solo da onLoad
qui:
gBrowser.addEventListener(this.loadType, function (event) {
nextplease.loadListener.onContentLoaded(event);
},
true);
Così gBrowser
è definito in onLoad
, ma in qualche modo indefinito in isTopLevelDocument
.
Quando ho provato a utilizzare effettivamente l'estensione, ho ricevuto un altro errore: "nextplease non è definito". La cosa interessante è che è accaduto sulle linee 853 e 857. Cioè, all'interno le funzioni
nextplease.getNextLink = function() {
nextplease.getLink(window.content, nextplease.NextPhrasesMap, nextplease.NextImagesMap, nextplease.isNextRegExp, nextplease.NEXT_SEARCH_TYPE);
}
nextplease.getPrevLink = function() {
nextplease.getLink(window.content, nextplease.PrevPhrasesMap, nextplease.PrevImagesMap, nextplease.isPrevRegExp, nextplease.PREV_SEARCH_TYPE);
}
Così nextplease
è in qualche modo definito abbastanza per chiamare queste funzioni, ma non è definito al loro interno.
Infine, l'esecuzione di typeof(nextplease)
in Esegui JS restituisce "oggetto". Lo stesso vale per gBrowser
.
Come può accadere? Qualche idea?
Variabili quantistiche? –
Bene, il contesto in cui inizialmente il codice viene eseguito non è necessariamente uguale al contesto in cui vengono eseguite le varie funzioni definite. (Non sono uno sviluppatore XUL, quindi sto solo lavorando sui primi principi.) Che cosa succederebbe se nascondessi "gBrowser" e "nextplease" nell'oggetto "nextplease" stesso? O in una chiusura che circonda le definizioni? – Pointy
@Pointy: ottimo punto in effetti. Questo potrebbe rivelarsi un buon esempio del perché le variabili globali sono cattive. Una chiusura potrebbe essere il modo per andare qui ... –