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
Objects
yContexts
(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 (=
window
en 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
window
objeto en sí. Dentro del contexto de una función, no tiene acceso directo al objeto de activación . Por ejemplo:new
crea una nueva instancia de un objeto autodefinido (contexto). Sinnew
el alcance de la función también seríaglobal
(= ventana). Este ejemplo alertaríaundefined
y1
respectivamente. Si reemplazáramosthis.a = 1; this.b = 2
con:Ambas salidas de alerta estarían indefinidas. En ese escenario, las variables
a
yb
se almacenarían en el Objeto de Activación desde elfoobar
cual no podemos acceder (por supuesto, podríamos acceder a ellas directamente llamandoa
yb
).fuente
eval
Es una opción.fuente
Puede usar el objeto de ventana para llegar a él.
window
tiene 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 elwindow
objeto, nothis
.this
es ambiguo.this
, o cualquier otra cosa, para acceder a la variabletype
desde 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
$$var
notació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
eval
el operador puede ejecutar una expresión de cadena en el contexto que llamó y devolver variables de ese contexto;literal object
teó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()
)eval
El 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
eval
se ejecutará. Para evitar sorpresas innecesarias en el código.eval
es muy fuerte pero estoy seguro de que ya lo sabesPor cierto, si fuera legal, podríamos usar
literal object
para 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
eval
operadoreval () 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
let
no funciona :Sin embargo usando
var
trabajosEspero que esto pueda ser útil para algunos.
fuente
const
const vars = { t, m, b }; console.log(vars['b'])
. De lo contrarioeval
también funciona.use Object también es genial.
fuente