En PHP puedes hacer cosas increíbles / horrendas como esta:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
¿Hay alguna forma de hacer algo así con Javascript?
Por ejemplo, si tengo una, var name = 'the name of the variable';¿puedo obtener una referencia a la variable con nombre name?
javascript
dynamic-variables
Finbarr
fuente
fuente

Respuestas:
Dado que ECMA- / Javascript se trata
ObjectsyContexts(que también son una especie de Objeto), cada variable se almacena en una variable llamada Variable- (o en el caso de una Función, Objeto de Activación ).Entonces, si creas variables como esta:
En el ámbito Global (= contexto de función NO), usted escribe implícitamente esas variables en el objeto Global (=
windowen un navegador).Se puede acceder a ellos utilizando la notación "punto" o "paréntesis":
o
Esto sólo funciona para el objeto global en este caso particular, debido a que el objeto variable del objeto global es el
windowobjeto en sí. Dentro del contexto de una función, no tiene acceso directo al objeto de activación . Por ejemplo:newcrea una nueva instancia de un objeto autodefinido (contexto). Sinnewel alcance de la función también seríaglobal(= ventana). Este ejemplo alertaríaundefinedy1respectivamente. Si reemplazáramosthis.a = 1; this.b = 2con:Ambas salidas de alerta estarían indefinidas. En ese escenario, las variables
aybse almacenarían en el Objeto de Activación desde elfoobarcual no podemos acceder (por supuesto, podríamos acceder a ellas directamente llamandoayb).fuente
evalEs una opción.fuente
Puede usar el objeto de ventana para llegar a él.
windowtiene una referencia a todas las variables globales y funciones globales que está utilizando.fuente
Simplemente no sé qué mala respuesta obtiene tantos votos. Es una respuesta bastante fácil, pero la haces compleja.
fuente
this": si desea acceder a una variable global de esta manera, es mejor ser explícito y usar elwindowobjeto, nothis.thises ambiguo.this, o cualquier otra cosa, para acceder a la variabletypedesde su ejemplo, si tiene su nombre en otra variable:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')se mostraráarticle, nosomething else. Y eso es lo que explica la "respuesta compleja".Prueba esto...
fuente
Esto es un ejemplo :
Otro ejemplo :
Entonces, el valor " coco " de myVariable se convierte en un coco variable .
Porque todas las variables en el ámbito global son propiedades del objeto Window.
fuente
En Javascript puede usar el hecho de que todas las propiedades son pares de valores clave. jAndy ya mencionó esto, pero no creo que su respuesta muestre cómo se puede explotar.
Por lo general, no está intentando crear una variable para contener un nombre de variable, sino que está tratando de generar nombres de variables y luego usarlos. PHP lo hace con
$$varnotación, pero Javascript no lo necesita porque las claves de propiedad son intercambiables con las claves de matriz.da 123. Por lo general, desea construir la variable, razón por la cual existe la indirección, por lo que también puede hacerlo al revés.
fuente
2019
TL; DR
evalel operador puede ejecutar una expresión de cadena en el contexto que llamó y devolver variables de ese contexto;literal objectteóricamente puede hacerlo escribiendo:{[varName]}pero bloqueado por definición.Así que me encuentro con esta pregunta y todos aquí solo juegan sin aportar una solución real. pero @Axel Heider se acerca bien.
La solución es
eval. operador casi olvidado. (creo que la mayoría eswith())evalEl operador puede ejecutar dinámicamente la expresión en el contexto al que llamó. y devuelve el resultado de esa expresión. podemos usar eso para devolver dinámicamente el valor de una variable en el contexto de la función.ejemplo:
Tenga en cuenta que siempre escribo explícitamente la expresión
evalse ejecutará. Para evitar sorpresas innecesarias en el código.evales muy fuerte pero estoy seguro de que ya lo sabesPor cierto, si fuera legal, podríamos usar
literal objectpara capturar el nombre y el valor de la variable, pero no podemos combinar los nombres de propiedad calculados y el valor de la propiedad, por desgracia, no es válidofuente
Si no desea utilizar un objeto global como window o global (nodo), puede intentar algo como esto:
fuente
Necesitaba dibujar múltiples FormData sobre la marcha y la forma de objeto funcionó bien
Luego, en mis bucles, donde sea que necesitaba crear un formulario de datos que utilicé
fuente
Esta es una alternativa para aquellos que necesitan exportar una variable con nombre dinámico
Otra alternativa es simplemente crear un objeto cuyas claves se denominen dinámicamente
fuente
lo que quieren decir es no, no puedes. No hay forma de hacerlo. así que era posible que pudieras hacer algo como esto
tener una función de creación como la implementada en ECMAScript 5.
fuente
evaloperadoreval () no funcionó en mis pruebas. Pero es posible agregar un nuevo código JavaScript al árbol DOM. Entonces, aquí hay una función que agrega una nueva variable:
fuente
var node_head = document.getElementsByTagName("head")[0]lugar de ID, ya que nadie le daid="head"a<head>:-)Aunque esto tiene una respuesta aceptada, me gustaría agregar una observación:
En ES6, el uso
letno funciona :Sin embargo usando
vartrabajosEspero que esto pueda ser útil para algunos.
fuente
constconst vars = { t, m, b }; console.log(vars['b']). De lo contrarioevaltambién funciona.use Object también es genial.
fuente