在 PHP 中,你可以做这样惊人/可怕的事情:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
有没有办法用 Javascript 做这样的事情?
例如,如果我有一个名称var name = 'the name of the variable';
,我可以获得对变量的引用name
吗?
在 PHP 中,你可以做这样惊人/可怕的事情:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
有没有办法用 Javascript 做这样的事情?
例如,如果我有一个名称var name = 'the name of the variable';
,我可以获得对变量的引用name
吗?
由于 ECMA-/Javascript 都是关于Objects
and Contexts
(它也是某种对象),所以每个变量都存储在一个称为Variable-(或在函数的情况下,激活对象)中。
因此,如果您创建这样的变量:
var a = 1,
b = 2,
c = 3;
在全局范围内(= 无函数上下文),您将这些变量隐式写入全局对象(=window
在浏览器中)。
这些可以通过使用“点”或“括号”符号来访问:
var name = window.a;
或者
var name = window['a'];
这仅适用于在这种特定情况下的全局对象,因为变量对象中的全局对象是window
对象本身。在函数的 Context 中,您不能直接访问Activation Object。例如:
function foobar() {
this.a = 1;
this.b = 2;
var name = window['a']; // === undefined
alert(name);
name = this['a']; // === 1
alert(name);
}
new foobar();
new
创建自定义对象(上下文)的新实例。没有new
函数的作用域也将是global
(=window)。此示例将分别发出警报undefined
和1
。如果我们将替换this.a = 1; this.b = 2
为:
var a = 1,
b = 2;
两个警报输出都将是未定义的。在这种情况下,变量a
andb
将存储在 Activation Object from 中foobar
,我们无法访问它(当然我们可以通过调用a
and直接访问它们b
)。
eval
是一种选择。
var a = 1;
var name = 'a';
document.write(eval(name)); // 1
警告:请注意,eval()
如果您不知道自己在做什么,则不建议使用该功能,因为它会带来多个安全问题。除非绝对必要,否则请使用其他东西。有关更多信息,请参阅MDN 页面以获取 eval。
您可以使用 window 对象来获取它。
window['myVar']
window
具有对您正在使用的所有全局变量和全局函数的引用。
只是不知道一个糟糕的答案会得到这么多票。这是一个很简单的答案,但你让它变得复杂。
// If you want to get article_count
// var article_count = 1000;
var type = 'article';
this[type+'_count'] = 1000; // in a function we use "this";
alert(article_count);
这是一个例子:
for(var i=0; i<=3; i++) {
window['p'+i] = "hello " + i;
}
alert(p0); // hello 0
alert(p1); // hello 1
alert(p2); // hello 2
alert(p3); // hello 3
另一个例子 :
var myVariable = 'coco';
window[myVariable] = 'riko';
alert(coco); // display : riko
因此,myVariable的值“ coco ”变成了变量coco。
因为全局范围内的所有变量都是Window对象的属性。