2009-04-07 5 views
25

¿Hay alguna manera de encontrar la variable de JavaScript en la página (obténgalo como un objeto) por su nombre? El nombre de la variable está disponible como una constante de cadena.Cómo encontrar la variable de JavaScript por su nombre

+0

Véase también la pregunta posterior con respuestas adicionales: http://stackoverflow.com/questions/5117127/javascript-dynamic-variable-name y http://stackoverflow.com/questions/1664282/javascript-refer-to- a-variable-using-a-string-containing-its-name – goodeye

Respuesta

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

Por favor, no use 'eval' para esto. –

+2

¿Qué pasa con las variables no globales? ¿Hay alguna otra opción que 'eval'? – mxro

+1

@mxro: en esa situación, querrá usar una [propiedad del objeto] (http://stackoverflow.com/a/25529838/157247). –

0

Se puede utilizar eval()

+3

never * ever * use eval donde no tenga que – annakata

+2

vote up. pregunta simple merece una respuesta simple. iría con eval() si por alguna razón tuviera que ver el contenido de una variable por su nombre. –

+3

A). ¿Qué no es simple acerca de la ventana [foo]? SEGUNDO). la velocidad y la seguridad no te conciernen, entonces? eval es tóxico, seriamente – annakata

26

objetos Todo (JS qué variables son) están disponibles en su alcance como las propiedades con nombre de su objeto padre. Donde no existe un padre explícito, es implícitamente el objeto window.

es decir:

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

y para un objeto complejo:

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

y esto puede ser encadenado:

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

eso es solo cierto para las variables con ámbito global: si el ámbito es de nivel funcional, no hay ningún objeto que permita el acceso al entorno léxico – Christoph

+0

Claro, pero nada lo ayuda allí. Esto supone que puede expresar la var como una construcción de notación de punto. – annakata

+0

Si necesita hacerlo dentro de una función, la única solución es poner sus vars en una objeción y acceder a las claves del objeto, como en este ejemplo: http://stackoverflow.com/questions/4109297/javascript-function-name -como una cadena en autoejecutable-función/4109730 # 4109730 –

4

Si la cadena hace referencia a una propiedad 'profunda' de una global, como 'Yankee.console.format' puede pasar por las referencias:

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

Si desea una variable declarada en el contexto global, se adjunta al objeto ventana. ex: window ["variableName"]. Todas las variables son un valor de tabla hash dentro de su alcance.

Si tiene que usar la notación de puntos, querrá seguir la sugerencia de kennebec para navegar por la jerarquía de objetos. eval() también puede funcionar, pero es una operación más costosa de lo que probablemente se necesite.

1

Si se trata de una variable global, se puede mirar hacia arriba por su nombre en el objeto global, ya que las variables globales son propiedades del objeto global. En los navegadores, hay una variable global que hace referencia al objeto global llamado window, por lo que:

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

Pero variables globales son una mala cosa (tm).

Para hacer esto sin globales, utilice su propio objeto:

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

Tanto de la obra anterior, porque en JavaScript, puede hacer referencia a una propiedad de objeto, ya sea con la notación de punto y un literal (obj.foo), o con notación entre corchetes y una cadena (obj["foo"]), y en el último caso, la cadena puede ser el resultado de cualquier expresión, incluida una búsqueda variable.

+0

¿Qué pasa si' obj' sería la variable a la que se accederá (y no 'obj.foo') - sería' eval' la única opción entonces? – mxro

+0

@mxro: Si 'obj' fuera global, podría usar' window ["obj"] '. Si no fuera así, entonces tendrías que usar 'eval'. Pero no lo haría, cambiaría mi código para poner 'obj' en un contenedor para poder buscarlo de la manera normal. –

+0

Sí, eso suena bien. Creo que inicialmente creé una variable en una declaración 'eval', que luego solo pude recuperar a través de un segundo' eval', pero luego cambié el código de una variable de contenedor antes de la primera 'eval'; eliminando la necesidad del segundo 'eval'. – mxro

Cuestiones relacionadas