Как найти переменную JavaScript по ее имени - PullRequest
30 голосов
/ 07 апреля 2009

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

Ответы [ 7 ]

32 голосов
/ 07 апреля 2009
<script>
var a ="test";
alert(a);
alert(window["a"]);
alert(eval("a"));
</script>
27 голосов
/ 07 апреля 2009

Все объекты 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'
5 голосов
/ 07 апреля 2009

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

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

4 голосов
/ 07 апреля 2009

Если ваша строка ссылается на «глубокое» свойство глобального объекта, например «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;
}
3 голосов
/ 02 июля 2013
var getVar = function (obj) {
    for(var key in this) {
        if(obj === this[key]) return key;
    }
};

foo = 'foo';

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

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

2 голосов
/ 27 августа 2014

Если это глобальная переменная, вы можете искать ее по имени в глобальном объекте, поскольку глобальные переменные являются свойствами глобального объекта. В браузерах есть глобальная переменная, которая ссылается на глобальный объект с именем 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"]), а в последнем случае строка может быть результатом любого выражения, включая поиск переменной.

0 голосов
/ 07 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...