В отличие от PHP, JavaScript не предоставляет доступ к массиву globals (который содержит ссылки на все имена переменных, объявленные в настоящее время). Таким образом, JavaScript не предлагает встроенной поддержки переменных переменных. Однако вы можете эмулировать эту функцию до тех пор, пока вы определяете все свои переменные как часть массива или объекта. Это, в свою очередь, создаст для вас массив gloabls. Например, вместо объявления переменной hello
в глобальной области видимости:
var hello = 'hello world';
давайте инкапсулируем это внутри объекта. Мы назовем этот объект vv (переменные переменные):
var vv = {
'hello': 'hello world',
//Other variable variables come here.
},
referToHello = 'hello';
Теперь мы можем ссылаться на переменную по ее индексу, а поскольку индексы массива могут быть предоставлены с использованием переменной, мы фактически используем переменную переменной:
console.log(vv[referToHello]); //Output: hello world
Ответ на ваш вопрос
Давайте применим это к коду, который вы указали в исходном вопросе:
var vv = {
'x': 'variable',
'variable': 'hello world!'
};
console.log(vv[vv['x']]); //Displays "hello, world!"
Практическое использование
Хотя предыдущий код может показаться нелепо громоздким и непрактичным, в JavaScript используются переменные с практическим использованием этого типа инкапсуляции. В приведенном ниже примере мы используем ту же концепцию, чтобы получить идентификатор неопределенного числа элементов 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);
});
В этом примере объявляются переменные переменные (ключи в elementIds
), основанные на идентификаторе каждого элемента, и будет назначаться узел указанного элемента в качестве значения каждой переменной. А поскольку использование глобальных переменных в JavaScript, как правило, не рекомендуется, давая вашим переменным переменные уникальную область видимости (в данном случае, объявляя их внутри массива elementIds
) не только аккуратно, но и более ответственно.