Есть ли способ ссылаться на переменную Javascript со строкой, содержащей ее имя?
Пример:
var myText = 'hello world!';
var someString = 'myText';
//how to output myText value using someString?
Есть ли способ ссылаться на переменную Javascript со строкой, содержащей ее имя?
Пример:
var myText = 'hello world!';
var someString = 'myText';
//how to output myText value using someString?
Вы можете использовать eval
, чтобы сделать это, хотя я стараюсь избежать такой вещи любой ценой.
alert(eval(someString));
Лучший способ, если вам нужно это сделать, - использовать хеш-таблицу.
var stuff = { myText: 'hello world!' };
var someString = 'myText';
alert( stuff[someString] );
Если эта переменная находится в глобальной области, вы можете использовать скобку нотации для глобального объекта:
var myText = 'hello world!';
var someString = 'myText';
alert(window[someString]);
Вы можете сделать это с помощью eval
:
var myText = 'hello world!';
var someString = 'myText';
eval('var theTextInMyText = ' + someString + ';');
alert(theTextInMyText);
Желание делать это вообще обычно является "запахом кода". Возможно, есть более элегантный способ...
eval("alert(" + someString + ");");
будет работать.
eval
сделает это:
var myText = 'hello world!!';
var someString = eval('myText');
document.getElementById('hello').innerHTML = someString;
Предполагая, что это находится на верхнем уровне, window[someString] === "hello world!"
.
В 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);
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)