A diferencia de PHP, JavaScript no ofrece acceso a la matriz global (que contiene referencias a todos los nombres de variables declarados actualmente). Como tal, JavaScript no ofrece soporte nativo para variables variables. Sin embargo, puede emular esta función siempre que defina todas sus variables como parte de una matriz o un objeto. Esto, a su vez, creará una matriz gloabls para usted. Por ejemplo, en lugar de declarar la variable hello
en el ámbito global de esta manera:
var hello = 'hello world';
vamos a encapsularlo dentro de un objeto. Llamaremos a ese objeto vv (variables variables):
var vv = {
'hello': 'hello world',
//Other variable variables come here.
},
referToHello = 'hello';
Ahora podemos referirnos a la variable por su índice, y dado que los índices de matriz se pueden proporcionar usando una variable, de facto estamos haciendo uso de una variable variable:
console.log(vv[referToHello]); //Output: hello world
La respuesta a tu pregunta
Apliquemos esto al código que proporcionó en la pregunta original:
var vv = {
'x': 'variable',
'variable': 'hello world!'
};
console.log(vv[vv['x']]); //Displays "hello, world!"
Un uso práctico
Si bien el código anterior puede parecer ridículamente engorroso y poco práctico, existen usos prácticos para las variables variables en JavaScript que utilizan este tipo de encapsulación. En el siguiente ejemplo, usamos el mismo concepto para obtener el ID de un número indefinido de elementos HTML.
var elementIds = [],
elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc.
elements.forEach( (element) => {
elementIds[element] = document.getElementById(element);
});
Este ejemplo declara variables variables (teclea elementIds
) en base al ID de cada elemento, y asignará el nodo de dicho elemento como el valor de cada variable. Y dado que generalmente se desaconseja el uso de variables globales en JavaScript, dar a sus variables variables un alcance único (en este caso, declararlas dentro de la elementIds
matriz) no solo es ordenado, sino también más responsable.