Javascript, обратитесь к переменной, используя строку, содержащую его имя?

Есть ли способ ссылаться на переменную Javascript со строкой, содержащей ее имя?

Пример:

var myText = 'hello world!';
var someString = 'myText';

//how to output myText value using someString?

Ответ 1

Вы можете использовать eval, чтобы сделать это, хотя я стараюсь избежать такой вещи любой ценой.

alert(eval(someString));

Лучший способ, если вам нужно это сделать, - использовать хеш-таблицу.

var stuff = { myText: 'hello world!' };
var someString = 'myText';
alert( stuff[someString] );

Ответ 2

Если эта переменная находится в глобальной области, вы можете использовать скобку нотации для глобального объекта:

var myText = 'hello world!';
var someString = 'myText';

alert(window[someString]);

Ответ 3

Вы можете сделать это с помощью eval:

var myText = 'hello world!';
var someString = 'myText';

eval('var theTextInMyText = ' + someString + ';');

alert(theTextInMyText);

Желание делать это вообще обычно является "запахом кода". Возможно, есть более элегантный способ...

Ответ 4

eval("alert(" + someString + ");");

будет работать.

Ответ 6

Предполагая, что это находится на верхнем уровне, window[someString] === "hello world!".

Ответ 7

В JavaScript нет стандарта для создания "Мастер-объекта" или любого встроенного метода для доступа к переменным в исходной области с помощью ссылки на строку, о которой я знаю.

Однако, если вы используете JavaScript для веб-разработки в браузере, объект window предоставит вам полный доступ к вашей текущей области. Например:

myVar = "This is my var"; 
if(myVar == window.myVar){
     /*
         This statement would return true
         Because both variables reference
         the same string;
     */
}

Этот метод позволит вам ссылаться на любую переменную scope, не создавая ее, но вы также можете использовать строку с помощью селекторов ([]).

window['myVar']

Следует отметить, что сохранение данных в виде переменной непосредственно в текущей области делает ее открытой для переопределения другими запущенными сценариями. Ваша переменная может быть перезаписана именами аргументов функций, для переменных цикла и просто назначением нового значения этой переменной.

Чтобы преодолеть это, я предлагаю использовать объект для хранения всех соответствующих данных в вашем приложении (Static And/or OOP). Вот так:

$myApp = {
     var1 : 'This is Var1',
     apply : function(){
          alert('Started!');
     }
}

//Referencing relative variables
alert($myApp.var1);

Ответ 8

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.getElementById("head")
  node_head.appendChild(node_script);
}

createVariable("dynamicVar", "some content")
console.log(dynamicVar)