如何按名称查找 JavaScript 变量

IT技术 javascript
2021-01-18 20:23:16

有没有办法通过名称在页面上找到 JavaScript 变量(将其作为对象)?变量名可用作字符串常量。

6个回答
<script>
var a ="test";
alert(a);
alert(window["a"]);
alert(eval("a"));
</script>
请不要eval用于此。
2021-03-27 20:23:16
非全局变量呢?还有其他选择eval吗?
2021-03-31 20:23:16
@mxro:在那种情况下,您会想要使用对象属性
2021-04-06 20:23:16

所有 JS 对象(哪些变量)都可以在其作用域内作为其父对象的命名属性使用。在不存在显式父项的情况下,它是隐式window对象。

IE:

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'
@Juan - 不过这不是函数级范围。
2021-03-13 20:23:16
这就是我评论的重点。如果没有 eval,您就无法对本地函数执行此操作。
2021-03-14 20:23:16
当然,但没有什么可以帮助你。这假设您可以将 var 表示为点符号结构。
2021-03-25 20:23:16
如果您需要在函数中执行此操作,唯一的解决方案是将您的变量放入反对中,并访问对象的键,例如:stackoverflow.com/questions/4109297/...
2021-03-30 20:23:16
这仅适用于全局范围的变量 - 如果范围是函数级,则没有允许访问词法环境的对象
2021-04-10 20:23:16

如果你想要一个在全局上下文中声明的变量,它被附加到 window 对象。例如:窗口[“变量名”]。所有变量都是其范围内的哈希表值。

如果您必须使用点分符号,那么您将需要遵循 kennebec 的建议,在对象层次结构中导航。eval() 也可以工作,但它是一个比可能需要的更昂贵的操作。

如果它是一个全局变量,您可以在全局对象上按名称查找它,因为全局变量是全局对象的属性。在浏览器上,有一个全局变量指向名为 的全局对象window,因此:

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

但是全局变量是一件坏事(tm)

要在没有全局变量的情况下执行此操作,请使用您自己的对象:

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

上述两种方法都有效,因为在 JavaScript 中,您可以使用点表示法和文字 ( obj.foo)来引用对象属性,也可以使用方括号表示法和字符串 ( obj["foo"])来引用对象属性,在后一种情况下,字符串可以是任何表达式,包括变量查找。

哇,谢谢,这也有用。但你是对的,不是很干净,我同意!
2021-03-21 20:23:16
@mxro:如果obj是全局的,你可以使用window["obj"]. 如果不是,那么您将不得不使用eval. 但我不会,我会更改我的代码以放入obj一个容器中,这样我就可以以正常方式查找它。
2021-03-22 20:23:16
@mxro:如果您在 an 中创建一个变量eval,您应该可以正常访问它:eval("var x = 42;"); console.log(x);在控制台中显示 42。(但几乎没有任何理由使用eval.)
2021-03-22 20:23:16
ifobj将是要访问的变量(而不是obj.foo)-将eval是唯一的选择呢?
2021-04-03 20:23:16
是的,这听起来不错。我想我最初在一个eval语句中创建了一个变量,然后我只能通过第二个来检索eval- 但随后更改了在第一个之前创建容器变量的代码eval省去第二个eval
2021-04-08 20:23:16

如果您的字符串引用了全局的 'deep' 属性,例如 '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;
}