2009-04-07 15 views
25

C'è un modo per trovare la variabile JavaScript sulla pagina (ottenerla come oggetto) con il suo nome? Il nome della variabile è disponibile come costante di stringa.Come trovare la variabile JavaScript con il suo nome

+0

Vedere anche la domanda successiva con risposte aggiuntive: http://stackoverflow.com/questions/5117127/javascript-dynamic-variable-name e http://stackoverflow.com/questions/1664282/javascript-refer-to- a-variable-using-a-string-contenente-its-name – goodeye

risposta

29
<script> 
var a ="test"; 
alert(a); 
alert(window["a"]); 
alert(eval("a")); 
</script> 
+37

Per favore non usare 'eval' per questo. –

+2

E le variabili non globali? C'è qualche altra opzione ma 'eval'? – mxro

+1

@mxro: In questa situazione, si desidera utilizzare una [proprietà dell'oggetto] (http://stackoverflow.com/a/25529838/157247). –

0

Si potrebbe utilizzare eval()

+3

mai * mai * uso eval dove non è necessario il voto – annakata

+2

. una semplice domanda merita una risposta semplice. andrei con eval() se per qualunque ragione avessi bisogno di guardare il contenuto di una variabile con il suo nome. –

+3

A). cosa non è semplice della finestra [foo]? B). la velocità e la sicurezza non ti riguardano allora? eval è tossico, seriamente – annakata

26

oggetti Tutti JS (quali variabili sono) sono disponibili all'interno del loro ambito di applicazione le proprietà denominate del loro oggetto padre. Dove non esiste un genitore esplicito, è implicitamente l'oggetto window.

cioè:

var x = 'abc'; 
alert(window['x']); //displays 'abc' 

e per un oggetto complesso:

var x = {y:'abc'}; 
alert(x['y']); //displays 'abc' 

e questo può essere concatenato:

var x = {y:'abc'}; 
alert(window['x']['y']); //displays 'abc' 
+5

valido solo per variabili con ambito globale: se l'ambito è a livello di funzione, non esiste alcun oggetto che consenta l'accesso all'ambiente lessicale. – Christoph

+0

Certo, ma nulla ti aiuta. Ciò presuppone che tu possa esprimere la var come un costrutto di notazione di punti. – annakata

+0

Se hai bisogno di farlo all'interno di una funzione, l'unica soluzione è mettere i tuoi vars in obiezione e accedere alle chiavi dell'oggetto, come in questo esempio: http://stackoverflow.com/questions/4109297/javascript-function-name -as-a-string-in-self-executing-function/4109730 # 4109730 –

4

Se la stringa fa riferimento a una proprietà 'profonda' di un globale, come "Yankee.console.format" puoi scorrere i riferimenti:

String.prototype.deref= function(){ 
    // remove leading and trailing quotes and spaces 
    var obj= this.replace(/(^[' "]+|[" ']+$)/g,''); 

    var M= obj.match(/(^[\w\$]+(\.[\w\$]+)*)/); 
    if(M){ 
     M= M[1].split('.'); 
     obj= window[M.shift()]; 
     while(obj && M.length) obj= obj[M.shift()]; 
    } 
    return obj || this; 
} 
5

Se si desidera una variabile dichiarata nel contesto globale, viene associata all'oggetto della finestra. ex: window ["variableName"]. Tutte le variabili sono un valore di tabella hash all'interno del loro ambito.

Se si deve usare la notazione puntata, si vorrà seguire il suggerimento di kennebec, per navigare attraverso la gerarchia degli oggetti. anche eval() può funzionare, ma è un'operazione più costosa di quanto sia probabilmente necessario.

1

Se si tratta di una variabile globale, si può guardare in su per nome sull'oggetto globale, dal momento che le variabili globali sono proprietà dell'oggetto globale. Sul browser, c'è una variabile globale che fa riferimento all'oggetto globale chiamato window, quindi:

var name = "foo"; 
window.foo = 42; 
alert(Number(window[name])); // 42 

Ma le variabili globali sono un male (tm).

di fare questo senza globali, utilizzare il proprio oggetto:

var name = "foo"; 
var obj = {}; 
obj.foo = 42; 
alert(Number(obj[name])); // 42 

Sia del lavoro di cui sopra, perché in JavaScript, è possibile fare riferimento a una proprietà dell'oggetto sia con la notazione punto e un valore letterale (obj.foo), o con notazione tra parentesi e una stringa (obj["foo"]), e in quest'ultimo caso, la stringa può essere il risultato di qualsiasi espressione, inclusa una ricerca variabile.

+0

Che dire se' obj' sarebbe la variabile a cui accedere (e non 'obj.foo') - sarebbe' eval' essere l'unica opzione allora? – mxro

+0

@mxro: Se 'obj' fosse globale, potresti usare' window ["obj"] '. Se così non fosse, allora dovresti usare 'eval'. Ma non lo farei, cambierei il mio codice per mettere 'obj' in un contenitore in modo da poterlo consultare nel modo normale. –

+0

Sì, sembra buono. Penso di aver inizialmente creato una variabile in un'istruzione 'eval', che poi ho potuto recuperare solo attraverso un secondo' eval' - ma poi ho cambiato il codice che una variabile contenitore viene creata prima del primo 'eval'; eliminando la necessità del secondo 'eval'. – mxro

Problemi correlati