Использование динамических имен переменных в JavaScript
в PHP вы можете делать удивительные / ужасные вещи, как это:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
есть ли способ сделать что-то подобное с Javascript?
например, если у меня есть var name = 'the name of the variable'; могу ли я получить ссылку на переменную с именем name?
11 ответов:
поскольку ECMA - / Javascript-это все о
ObjectsиContexts(которые, также являются somekind объекта), каждая переменная хранится в такой называется переменной- (или, в случае функции Активация).так что если вы создаете переменные вроде этого:
var a = 1, b = 2, c = 3;на глобальный масштаб (= нет контекста функции), вы неявно записываете эти переменные в глобальный объект (=
windowв a броузер.)к ним можно получить доступ с помощью обозначения" точка "или" скобка":
var name = window.a;или
var name = window['a'];это работает только для глобальных объектов в данном конкретном случае, потому что Переменной Объекта на Глобальный Объект - это
windowсам объект. В контексте функции у вас нет прямого доступа к Активация. Например:function foobar() { this.a = 1; this.b = 2; var name = window['a']; // === undefined alert(name); name = this['a']; // === 1 alert(name); } new foobar();
newсоздает новый экземпляр самостоятельного объекта (контекста). Безnewобласть действия функции будет такжеglobal(=окно). Этот пример будет предупреждатьundefinedи1соответственно. Если бы мы заменилиthis.a = 1; this.b = 2С:var a = 1, b = 2;оба вывода оповещений будут неопределенными. В этом случае переменные
aиbбудет храниться в объекте активации отfoobar, к которым мы не можем получить доступ (конечно, мы могли бы получить доступ к ним напрямую, позвонивaиb).
вы можете использовать объект window, чтобы добраться до него .
window['myVar']
windowесть ссылка на все глобальные переменные и глобальные функции, которые вы используете.
просто не знаю, что плохой ответ получает так много голосов. Это довольно простой ответ, но вы делаете его сложным.
// If you want to get article_count // var article_count = 1000; var type = 'article'; this[type+'_count'] = 1000; // in a function we use "this"; alert(article_count);
вот пример :
for(var i=0; i<=3; i++) { window['p'+i] = "hello " + i; } alert(p0); // hello 0 alert(p1); // hello 1 alert(p2); // hello 2 alert(p3); // hello 3еще пример :
var myVariable = 'coco'; window[myVariable] = 'riko'; alert(coco); // display : rikoИтак, значение"Коко" из myVariable становится переменной Коко.
потому что все переменные в глобальной области являются свойствами объекта Window.
в JavaScript вы можете использовать тот факт, что все свойства являются пары ключ-значение. дженди уже упоминал об этом, но я не думаю, что его ответ показывает, как его можно использовать.
обычно вы не пытаетесь создать переменную для хранения имени переменной, но пытаетесь создать имена переменных, а затем использовать их. PHP делает это с
$$varнотация, но Javascript не нужно, потому что ключи свойств взаимозаменяемы с ключами массива.var id = "abc"; var mine = {}; mine[id] = 123; console.log(mine.abc);дает 123. Обычно ты хотите построить переменную, поэтому есть косвенность, поэтому вы также можете сделать это наоборот.
var mine = {}; mine.abc = 123; console.log(mine["a"+"bc"]);
Если вы не хотите использовать глобальный объект, такой как window или global (node), вы можете попробовать что-то вроде этого:
var obj = {}; obj['whatever'] = 'There\'s no need to store even more stuff in a global object.'; console.log(obj['whatever']);
они имеют в виду, что нет, вы не можете. нет никакого способа сделать это. так что, возможно, вы могли бы сделать что-то вроде этого
function create(obj, const){ // where obj is an object and const is a variable name function const () {} const.prototype.myProperty = property_value; // .. more prototype return new const(); }наличие функции create, аналогичной той, что реализована в ECMAScript 5.
мне нужно было нарисовать несколько FormData на лету и объект способ работал хорошо
var forms = {}затем в моих циклах, где бы мне ни нужно было создать данные формы, которые я использовал
forms["formdata"+counter]=new FormData(); forms["formdata"+counter].append(var_name, var_value);
eval () не работал в моих тестах. Но добавление нового кода JavaScript в дерево DOM возможно. Итак, вот функция, которая добавляет новую переменную:
function createVariable(varName,varContent) { var scriptStr = "var "+varName+"= \""+varContent+"\"" var node_scriptCode = document.createTextNode( scriptStr ) var node_script = document.createElement("script"); node_script.type = "text/javascript" node_script.appendChild(node_scriptCode); var node_head = document.getElementsByTagName("head")[0] node_head.appendChild(node_script); } createVariable("dynamicVar", "some content") console.log(dynamicVar)
Comments