Использование имен динамических переменных в 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).


eval Это один вариант.

var a = 1;
var name = 'a';

document.write(eval(name)); // 1

вы можете использовать объект 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);

a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);

попробуйте это...


вот пример :

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

Итак, значение"Коко " of 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)