Utilice nombres de variables dinámicas en JavaScript [duplicado]

Resuelto Finbarr asked hace 13 años • 18 respuestas

En PHP puedes hacer cosas increíbles/horrendas como esta:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1

¿Hay alguna manera de hacer algo como esto con Javascript?

Por ejemplo, si tengo un var name = 'the name of the variable';¿puedo obtener una referencia a la variable con nombre name?

Finbarr avatar Feb 25 '11 19:02 Finbarr
Aceptado

Dado que ECMA-/Javascript se trata de Objectsy (que también son algún tipo de Objeto), cada variable se almacena en una variableContexts llamada (o en el caso de una Función, Objeto de activación ).

Entonces, si creas variables como esta:

var a = 1,
    b = 2,
    c = 3;

En el alcance global (= SIN contexto de función), escribe implícitamente esas variables en el objeto Global (= windowen un navegador).

Se puede acceder a ellos utilizando la notación de "punto" o "corchete":

var name = window.a;

o

var name = window['a'];

Esto sólo funciona para el objeto global en este caso particular, porque el objeto variable del objeto global es el windowobjeto mismo. Dentro del contexto de una función, no tienes acceso directo al objeto de activación . Por ejemplo:

function foobar() {
  this.a = 1;
  this.b = 2;

  var name = window['a']; // === undefined
  console.log(name);
  name = this['a']; // === 1
  console.log(name);
}

new foobar();
Expandir fragmento

newcrea una nueva instancia de un objeto autodefinido (contexto). Sin newel alcance de la función sería también global(=ventana). Este ejemplo alertaría undefinedy 1respectivamente. Si reemplazáramos this.a = 1; this.b = 2con:

var a = 1,
    b = 2;

Ambas salidas de alerta no estarían definidas. En ese escenario, las variables ay bse almacenarían en el Objeto de activación desde foobar, al que no podemos acceder (por supuesto, podríamos acceder a ellas directamente llamando aa y b).

jAndy avatar Feb 25 '2011 12:02 jAndy

evales una opción.

var a = 1;
var name = 'a';

document.write(eval(name)); // 1
Expandir fragmento

Advertencia: Tenga en cuenta que no se recomienda utilizar la eval()función si no sabe lo que está haciendo, ya que trae múltiples problemas de seguridad. Utilice otra cosa a menos que sea absolutamente necesario. Consulte la página de MDN para evaluación para obtener más información.

erickb avatar Feb 25 '2011 12:02 erickb

Puede utilizar el objeto ventana para acceder a él.

window['myVar']

windowtiene una referencia a todas las variables globales y funciones globales que está utilizando.

JohnP avatar Feb 25 '2011 12:02 JohnP

Simplemente no sé qué mala respuesta obtiene tantos votos. Es una respuesta bastante fácil pero la haces compleja.

// If you want to get article_count
// var article_count = 1000;
var type = 'article';
this[type+'_count'] = 1000;  // in a function we use "this";
alert(article_count);
Terry Lin avatar Jan 21 '2015 09:01 Terry Lin