Если я правильно понимаю ваш вопрос, у вас есть что-то вроде этого:
function foo() {
var flower_1 = { /* ... */ };
var flower_2 = { /* ... */ };
var name = "flower_1";
var target = /* code here to get the correct object based on `name` */;
}
Вы можете сделать это, но этого следует избегать, если это вообще возможно:
var target = eval(name);
eval
- очень большой и легко используемый инструмент, которого следует избегать.Мне никогда не приходилось использовать его в производственном коде за несколько лет разработки JavaScript.Также обратите внимание, что eval
не разрешено в новом «строгом» режиме языка (одно из многих улучшений, которое приносит строгий режим).
В этом конкретном случае этого довольно легко избежать:
function foo() {
var objects = {
flower_1: { /* ... */ },
flower_2: { /* ... */ }
};
var name = "flower_1";
var target = objects[name];
}
Теперь flower_1
и flower_2
являются свойствами объекта, и вы можете использовать обозначение в скобках ([]
) со строковым именем для доступа к этим свойствам,Это связано с тем, что в объектах JavaScript вы можете получить доступ к свойству с помощью точечной нотации и литерала (например, obj.foo
) или с помощью нотации в скобках и строки (например, obj["foo"]
).Во втором случае строка не обязательно должна быть строковым литералом, она может быть результатом выражения, включая (как в этом случае) извлечение строки из переменной.
Вотживой пример обоих методов.
Обратите внимание, что если ваши операторы var
являются глобальными, то эти переменные становятся свойствами глобального объекта, который в веб-браузерах равен window
, поэтому если они глобальные, вы можете получить к ним доступ через window[name]
по той же причине, по которой objects[name]
работает.Но лучше избегать глобальных переменных (если это возможно, полностью, или указывать только одну с хорошим уникальным именем, которая затем при необходимости содержит все ваши общедоступные материалы - например, если внешний код должен иметь доступ к вашим материалам).