«Переменные» переменные в Javascript? - PullRequest
90 голосов
/ 04 марта 2011

Я знаю, что в PHP возможно иметь «переменные» переменные.Например,

$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"

Можно ли ссылаться на переменную по имени в виде строки в javascript?Как бы это было сделано?

Ответы [ 7 ]

121 голосов
/ 04 марта 2011

Единого решения для этого не существует (ну, есть 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]);

В ES2015 + это еще проще сделать для существующих переменных, используя краткое обозначение свойства :

// GOOD
var foo = 42;
var bar = 21;
var obj = {foo, bar};

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]);
42 голосов
/ 04 марта 2011

Если вы отчаянно хотите сделать это, вы можете попробовать использовать eval ():

var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);

Или используя объект окна:

var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);

http://www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript

3 голосов
/ 09 ноября 2014

Чтобы ссылаться на переменную в javascript только со строкой, вы можете использовать

window['your_variable_name']

Вы можете устанавливать и ссылаться на переменные, а также объекты в переменных.

2 голосов
/ 20 ноября 2017

В отличие от 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) не только аккуратно, но и более ответственно.

1 голос
/ 13 июля 2017

Вы можете использовать функцию JavaScript eval(str).

Эта функция преобразует предоставленную строку в код JS, а затем выполняет ее.

Например:

eval("console.log('hello world')"); // Logs hello world

Таким образом, чтобы использовать его как переменную переменной, вы можете сделать следующее:

var a = "hello";
var hello = "world";
console.log(a + " " + eval(a)); // Logs hello world

Это даст тот же результат, что и:

console.log(a + " " + hello); // Logs hello world

(Пример взят из руководства PHP по переменным переменным .)

1 голос
/ 10 марта 2014
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);
1 голос
/ 13 октября 2012

Конечно можно, но не надо. Переменные должны быть глобальными.

var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
...