JavaScript 中的变量变量

Variable variables in JavaScript

提问人:Sami Al-Subhi 提问时间:1/15/2012 最后编辑:ThiefMasterSami Al-Subhi 更新时间:1/15/2012 访问量:2406

问:

据我所知,PHP中已经存在此功能。让我们看一下下面的 PHP 代码:

$color = 'red';
$$color = 'dark';

功能说明:

有时,能够拥有变量变量名称很方便。也就是说,可以动态设置和使用的变量名称。变量变量采用变量的值,并将其视为变量的名称。在上面的例子中,红色可以用作变量的名称。此时,PHP符号树中已经定义并存储了两个变量:with contents和with contents 。$color"red"$red"dark"

我的问题

这可以在 java 脚本中完成吗?

JavaScript 变量

评论

1赞 Felix Kling 1/15/2012
Javascript 变量变量的可能重复项
1赞 ThiefMaster 1/15/2012
有时可能很方便,但它是一个巨大的质量!
1赞 frederj 6/3/2019
Javascript 中的“变量”变量可能重复?

答:

6赞 T.J. Crowder 1/15/2012 #1

我想到了三种不同的技术,每种技术都有其警告和(第二种除外)用途:

1) 您可以使用关键字在代码中的任何位置在 JavaScript 中声明一个新变量:var

var $color = 'red';

该变量实际上是发生 事件的整个作用域中定义的,甚至在语句上方 — 也就是说,这两个函数是相同的,即使它们看起来略有不同:varvar

function foo() {
    doSomething();
    var x = 5;
    x += doSomethingElse();
    return x;
}

function foo() {
    var x;

    doSomething();
    x = 5;
    x += doSomethingElse();
    return x;
}

这是因为所有 s 在创建函数的上下文时生效,而不是它们在代码中出现的位置。更多: 可怜的,被误解的 varvar

2)如果你只是赋值一个从未在任何地方声明过的自由符号,你将创建一个隐式全局变量(而不是一个受限于当前范围的变量),这通常是一个坏主意。更多:隐式全局变量的恐怖

3)你可以做的另一件事是有一个对象,它是你想要跟踪的各种变量的容器。只需分配对象,即可在对象上创建新属性:

var data = {};    // A blank object
data.foo = "bar"; // Now `data` has a `foo` property

当您需要跟踪脚本完全不知道的数据时,例如基于用户输入,此技术特别方便,因为您可以使用上述虚线表示法和文字 (),也可以使用括号表示法和字符串 ()。在后一种情况下,字符串可以是任何表达式的结果,因此所有这些表达式都会在以下位置创建一个属性:data.foodata["foo"]foodata

// Dotted notation with a literal
data.foo = 42;

// Bracketed notation with a literal string
data["foo"] = 42;

// Bracketed notation with a string coming from a variable
s = "foo";
data[s] = 42;

// Bracketed notation with a string coming from an expression
s = "o";
data["f" + s + s] = 42;

评论

0赞 Sami Al-Subhi 1/15/2012
在你的回答中找不到我要找的东西。无论如何,谢谢。
0赞 T.J. Crowder 1/15/2012
@SamiAl-Subhi:我认为上面的第三个选项最接近您在编辑中描述的PHP概念。 ,然后用作变量的名称:表示具有 .s = "foo";sdata[s] = 42;data.foo42
0赞 ThiefMaster 1/15/2012
@SamiAl-Subhi:第三种选择是你应该这样做的方式。不要创建一大堆全局变量!但是,如果您真的需要,您可以将这些变量存储在 - 这将使它们成为全局的。windowdata
0赞 Sami Al-Subhi 1/15/2012
@ThiefMaster我想为变量分配一个对象,我将在我的代码中的不同位置多次使用它。因此,第三种方式不会为我做,我 suppose.AM,对吧?window[color]=document.getElementById("v")
0赞 T.J. Crowder 1/15/2012
@SamiAl-Subhi:效果很好。 是一个对象,就像我的例子一样。例如,假设这是一个包含字符串的变量,那么将愉快地创建一个引用元素的全局变量。全局变量是对象的属性,因此最好避免使用全局变量,但如果必须使用它们,那将起作用。windowdatacolor'red'window[color]=document.getElementById("v")redwindowcolor = 'red';window[color] = 42;alert(window.red); /* alerts 42 */alert(red); /* Also alerts 42 */alert(window[color]); /* ALSO alerts 42 */
4赞 Vitalii Petrychuk 1/15/2012 #2
var color = 'red';
window[color] = 'dark';
console.log(color, red);

评论

0赞 Sami Al-Subhi 1/15/2012
我可以在日志中看到你做对了,但不能使用它给出错误的变量document.getElementById("v").innerHTML= red;cant set the property of innerHTML of NULL