"Переменные" переменные в Javascript?
Я знаю,что в PHP возможно иметь переменные" переменные". Например
$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"
возможно ли это в javascript? Как это сделать?
7 ответов
для этого нет единого решения (ну, есть eval
, но давайте не будем серьезно рассматривать это). Есть возможность доступа некоторые глобальные переменные динамически через window
, но это не работает для локальных переменных функции. Глобальные переменные, которые не стать собственностью window
переменные определены с let
и const
и class
es.
почти всегда есть лучшее решение, чем использование переменной переменные! вместо этого вы должны смотреть на структуры данных и выбрать правильный для вашей проблемы.
если у вас есть фиксированный набор имен, таких как
// BAD
var foo = 42;
var bar = 21;
var key = 'foo';
console.log(eval(key));
сохраните эти имя / значения как свойства объект и использовать скобочная нотация чтобы посмотреть их динамически:
// GOOD
var obj = {
foo: 42,
bar: 21,
};
var key = 'foo';
console.log(obj[key]);
если вы" последовательно " пронумерованы переменные, такие как
// BAD
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';
var index = 1;
console.log(eval('foo' + index));
тогда вы должны использовать массив вместо этого и просто используйте индекс для доступа к соответствующему значению:
// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);
Если вы отчаянно хотите это сделать, вы можете попробовать использовать eval ():
var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);
или с помощью объекта window:
var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);
http://www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript
чтобы ссылаться на переменную в javascript только со строкой, вы можете использовать
window['your_variable_name']
вы можете устанавливать и ссылаться на переменные, а также объекты в переменных.
в отличие от 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!"
A Практическое Использование
хотя предыдущий код может показаться смехотворно громоздким и непрактичным, в 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
array) не только аккуратный, но и более ответственный.
конечно можно, но не. Переменные должны быть глобальными.
var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])