2011-01-31 13 views
20

Supponiamo di fare qualcosa di simile (come parte della costruzione di un oggetto JavaScript):Come controllare le variabili di chiusura legate in javascript?

var foo = 3; 
this.method = function() { alert(foo); }; 

Ora una chiusura sarà generato per assicurarsi foo viene mantenuto e disponibile per l'uso in method. C'è un modo per fare introspezione sulla chiusura attuale?

Quello che sto cercando è un modo per enumerare tutte le variabili disponibili all'interno di method, che dovrebbe includere foo. Il codice di debug come questo sarebbe di grande aiuto nel debugging del binding delle chiusure, ma devo ancora trovarlo. È possibile farlo?

risposta

10

Il linguaggio non contiene tali possibilità. In effetti, i dati nascosti nelle chiusure di JavaScript sono una delle poche cose che sono realmente private (in contrapposizione ai dati "privati" in C#, C++, Java ecc. A cui è sempre possibile accedere con il puntatore magico o il riflesso).

In breve, questa sarebbe una cosa a livello di compilatore. Quello che si può sperare è uno strumento integrato in uno dei principali interpreti JavaScript (o almeno una funzionalità integrata per collegare tale strumento al motore principale). Uno in Firefox/Firebug o V8/Node.js sarebbe bello, ma credo che per il momento non siamo fortunati.

7

Da 1.11.2, la riga di comando di Firebug include un'estensione di sintassi per ottenere il valore di foo: this.method.%foo.

L'intera chiusura può anche essere ispezionata attivando l'opzione "Mostra chiusure" nel pannello DOM ed espandendo la pseudo proprietà "(chiusura)" di this.method. Questo funziona anche in Chrome (lì la pseudo proprietà è chiamata <function scope>, non c'è un prefetto per questo).

0

Forse JavaScript non lo implementa di default ma posso immaginare un modo di leggere tutte le proprietà da Oggetto globale (dato che foo ne è una proprietà) e leggere ogni proprietà fino ad arrivare alla chiusura, anche se questo sarebbe molto lento . Devo dire che non ne so molto di javascript e forse sto solo dicendo delle noncinzioni, ma forse hai una nuova idea dal mio approccio.

+1

Se 'foo' è una variabile locale (forse l'esempio dell'OP è tutto all'interno di un costruttore), quindi non sarà raggiungibile dall'oggetto globale. – dpercy

Problemi correlati