在JavaScript中使用动态变量名

在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
Contexts
(它们也是Object的某种类型),因此每个变量都存储在一个名为Variable的变量中(或者在函数,激活对象的情况下)。 所以如果你创建这样的变量:
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
   alert(name);
   name = this['a']; // === 1
   alert(name);
}

new foobar();
new
创建自定义对象(上下文)的新实例。没有
new
,函数的范围也是
global
(=窗口)。这个例子将分别提醒
undefined
1
。如果我们用以下内容替换
this.a = 1; this.b = 2
var a = 1,
    b = 2;
两个警报输出都是未定义的。在那种情况下,变量
a
b
将从
foobar
存储在激活对象中,我们无法访问(当然我们可以通过调用
a
b
直接访问它们)。     
eval
是一种选择。
var a = 1;
var name = 'a';

document.write(eval(name)); // 1
    
您可以使用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);
    
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);
试试这个...     
这是一个例子:
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对象的属性。     
在Javascript中,您可以使用所有属性都是键值对的事实。 jAndy已经提到了这一点,但我不认为他的答案显示了它是如何被利用的。 通常,您不是要创建一个变量来保存变量名,而是尝试生成变量名然后再使用它们。 PHP使用
$$var
表示法,但Javascript不需要,因为属性键可与数组键互换。
var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);
给出123.通常你想构造变量,这就是为什么存在间接,所以你也可以反过来做。
var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);
    
如果您不想使用像窗口或全局(节点)这样的全局对象,可以尝试这样的事情:
var obj = {};
obj['whatever'] = 'There's no need to store even more stuff in a global object.';

console.log(obj['whatever']);
    
我需要动态绘制多个FormData,并且对象方式运行良好
var forms = {}
然后在我的循环中,我需要创建一个我使用的表单数据
forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);
    
他们的意思是不,你不能。 没有办法完成它。 所以你有可能做到这样的事情
function create(obj, const){
// where obj is an object and const is a variable name
function const () {}

const.prototype.myProperty = property_value;
// .. more prototype

return new const();

}
具有与ECMAScript 5中实现的创建功能相同的创建功能。     
eval()在我的测试中不起作用。但是可以向DOM树添加新的JavaScript代码。所以这是一个添加新变量的函数:
function createVariable(varName,varContent)
{
  var scriptStr = "var "+varName+"= ""+varContent+"""

  var node_scriptCode = document.createTextNode( scriptStr )
  var node_script = document.createElement("script");
  node_script.type = "text/javascript"
  node_script.appendChild(node_scriptCode);

  var node_head = document.getElementsByTagName("head")[0]
  node_head.appendChild(node_script);
}

createVariable("dynamicVar", "some content")
console.log(dynamicVar)
    
2019 TL; DR
eval
运算符可以在它调用的上下文中运行字符串表达式并返回值,也是变量;
literal object
理论上可以做到
{[varName]}
,但它被定义阻止了。 所以我遇到了这个问题,这里的每个人都在玩,而没有带来真正的解决方案。感谢正在接近的@Axel Heider。 正确的解决方案是
eval
几乎被遗忘的语言操作员。 (我认为最多的是
with
) 所以保留字运算符
eval
可以在它调用的上下文中动态运行表达式。并返回该表达式的结果。我们可以使用它在函数上下文中动态返回变量的值。 例:
function exmaple1(){
   var a = 1, b = 2, default = 3;
   var name = 'a';
   return eval(name)
}

example1() // return 1


function example2(option){
  var a = 1, b = 2, defaultValue = 3;

  switch(option){
    case 'a': name = 'a'; break;
    case 'b': name = 'b'; break;
    default: name = 'defaultValue';
  }
  return eval (name);
}

example2('a') // return 1
example2('b') // return 2
example2() // return 3
请注意,我总是明确写出
eval
将运行的表达式。 避免代码中不必要的意外。
eval
非常强大 但我相信你已经知道了 顺便说一句,如果它是合法的,我们可以使用
literal object
来捕获变量名和值,但是我们不能将计算属性名和属性值简写结合起来,遗憾的是,它是无效的
functopn example( varName ){
    var var1 = 'foo', var2 ='bar'

    var capture = {[varName]}

}

example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`
    

要回复问题请先登录注册