在 JavaScript 中使用动态变量名称

2022-08-29 23:28:22

在PHP中,你可以做一些惊人/可怕的事情,比如这样:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1

有没有办法用Javascript做这样的事情?

例如,如果我有一个,我能得到一个带有名称的变量的引用吗?var name = 'the name of the variable';name


答案 1

由于 ECMA-/Javascript 是关于和的(这也是某种对象),因此每个变量都存储在一个所谓的变量中(或者在函数的情况下,激活对象)。ObjectsContexts

因此,如果您创建这样的变量:

var a = 1,
    b = 2,
    c = 3;

全局作用域 (= NO 函数上下文) 中,将这些变量隐式写入 Global 对象 (= 在浏览器中)。window

这些可以通过使用“点”或“括号”表示法来访问:

var name = window.a;

var name = window['a'];

这仅适用于此特定实例中的全局对象,因为全局对象的变量对象是对象本身。在函数的上下文中,您无法直接访问激活对象。例如:window

function foobar() {
  this.a = 1;
  this.b = 2;

  var name = window['a']; // === undefined
  console.log(name);
  name = this['a']; // === 1
  console.log(name);
}

new foobar();

new创建自定义对象(上下文)的新实例。如果没有函数的作用域,该函数也将是(=窗口)。此示例将分别发出警报 和。如果我们用以下代码替换:newglobalundefined1this.a = 1; this.b = 2

var a = 1,
    b = 2;

两个警报输出都将未定义。在这种情况下,变量 和 将存储在 激活对象中,我们无法从 中访问该激活对象(当然,我们可以通过调用 和 直接访问这些变量)。abfoobarab


答案 2

eval是一个选项。

var a = 1;
var name = 'a';

document.write(eval(name)); // 1

警告:请注意,如果您不知道自己在做什么,则不建议使用该函数,因为它会带来多个安全问题。除非绝对必要,否则使用其他内容。有关详细信息,请参阅 MDN 页面以获取评估。eval()