Для этого нет единственного решения (ну, есть eval
, но не стоит серьезно относиться к этому). Доступ к глобальным переменным возможен динамически через window
, но это не работает для переменных, локальных для функции.
Почти всегда есть лучшее решение, чем использование переменных переменных! Вместо этого вы должны смотреть на структуры данных и выбирать правильную для своей проблемы.
Если у вас есть фиксированный набор имен, например
// 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]);
Вы не можете, литерал шаблона был оценен и преобразован в строку, когда инициализатор объекта, который был внутри, был оценен. obj.title
- результат вычисления литерала шаблона (строка 1), а не какого-либо объекта шаблона. Литералы шаблонов - это именно то, что: литеральная нотация , которая оценивается, когда она встречается (точно так же, как строковый литерал оценивается, в результате получается строка, когда встречается литерал строки) .
Вместо этого вы можете сделать title
функцию, которую вы передаете name
в:
let obj1 = { name: 'abc' },
obj2 = { title : name => `${name}` }
Вы должны называть ее, конечно, когда захотите заголовок.
¹ Строка в этом случае , поскольку шаблонный литерал был автономным, не привязан к функции тега.
${obj1.name}
вместо${name}
выше, нажмите «Обновить».) i> – T.J. Crowder 13 July 2018 в 16:14