如何通过名称查找JavaScript变量

use*_*713 30 javascript

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

Cat*_*ICU 32

<script>
var a ="test";
alert(a);
alert(window["a"]);
alert(eval("a"));
</script>
Run Code Online (Sandbox Code Playgroud)

  • 请不要使用`eval`. (43认同)
  • 那么非全局变量呢?"eval"还有其他选择吗? (2认同)
  • @mxro:在这种情况下,您想使用[对象属性](http://stackoverflow.com/a/25529838/157247)。 (2认同)

ann*_*ata 27

所有JS对象(哪些变量都是)在其作用域中可用作其父对象的命名属性.在没有显式父级的情况下,它隐含地是window对象.

即:

var x = 'abc';
alert(window['x']); //displays 'abc'
Run Code Online (Sandbox Code Playgroud)

对于一个复杂的对象:

var x = {y:'abc'};
alert(x['y']); //displays 'abc'
Run Code Online (Sandbox Code Playgroud)

这可以链接:

var x = {y:'abc'};
alert(window['x']['y']); //displays 'abc'
Run Code Online (Sandbox Code Playgroud)

  • 这对于全局范围的变量是唯一的 - 如果范围是函数级别,则没有允许访问词法环境的对象 (6认同)
  • 这是我评论的重点.如果没有eval,则无法对本地函数执行此操作. (3认同)

Tra*_*er1 5

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

如果您必须使用点分表示法,那么您将需要遵循kennebec的建议,以浏览对象层次结构.eval()也可以工作,但是操作比可能需要的更昂贵.


T.J*_*der 5

如果它是全局变量,则可以在全局对象上通过名称查找它,因为全局变量是全局对象的属性。在浏览器上,有一个全局变量引用名为 的全局对象window,因此:

var name = "foo";
window.foo = 42;
alert(Number(window[name])); // 42
Run Code Online (Sandbox Code Playgroud)

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

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

var name = "foo";
var obj = {};
obj.foo = 42;
alert(Number(obj[name])); // 42
Run Code Online (Sandbox Code Playgroud)

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