Как найти переменную JavaScript по ее имени

Есть ли способ найти переменную JavaScript на странице (получить ее как объект) по ее имени? Имя переменной доступно в виде строковой константы.

7 ответов

Решение
<script>
var a ="test";
alert(a);
alert(window["a"]);
alert(eval("a"));
</script>

Все объекты JS (которые являются переменными) доступны в пределах их области действия как именованные свойства их родительского объекта. Там, где нет явного родителя, это неявно window объект.

то есть:

var x = 'abc';
alert(window['x']); //displays 'abc'

и для сложного объекта:

var x = {y:'abc'};
alert(x['y']); //displays 'abc'

и это может быть приковано:

var x = {y:'abc'};
alert(window['x']['y']); //displays 'abc'

Если вам нужна переменная, объявленная в глобальном контексте, она присоединяется к объекту окна. пример: window["variableName"]. Все переменные являются значением хеш-таблицы в своей области видимости.

Если вам нужно использовать пунктирную нотацию, то вы можете последовать совету Кеннебека, чтобы перемещаться по иерархии объектов. eval() также может работать, но это более дорогая операция, чем, вероятно, необходимо.

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

var name = "foo";
window.foo = 42;
alert(Number(window[name])); // 42

Но глобальные переменные - это плохо(тм).

Чтобы сделать это без глобалов, используйте свой собственный объект:

var name = "foo";
var obj = {};
obj.foo = 42;
alert(Number(obj[name])); // 42

Оба вышеперечисленных варианта работают, потому что в JavaScript вы можете ссылаться на свойство объекта с помощью точечной нотации и литерала (obj.foo), или с записью в скобках и строкой (obj["foo"]), а в последнем случае строка может быть результатом любого выражения, включая поиск переменной.

Если ваша строка ссылается на "глубокое" свойство глобальной переменной, например "Yankee.console.format", вы можете просмотреть ссылки:

String.prototype.deref= function(){
    // remove leading and trailing quotes and spaces
    var obj= this.replace(/(^[' "]+|[" ']+$)/g,'');

    var M= obj.match(/(^[\w\$]+(\.[\w\$]+)*)/);
    if(M){
        M= M[1].split('.');
        obj= window[M.shift()];
        while(obj && M.length) obj= obj[M.shift()];
    }   
    return obj || this;
}
var getVar = function (obj) {
    for(var key in this) {
        if(obj === this[key]) return key;
    }
};

foo = 'foo';

console.log( getVar(foo) ); // => 'foo'

https://stackru.com/a/17432007/1250044

Вы можете использовать eval()

Другие вопросы по тегам