Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中使用动态变量名_Javascript_Dynamic Variables - Fatal编程技术网

在JavaScript中使用动态变量名

在JavaScript中使用动态变量名,javascript,dynamic-variables,Javascript,Dynamic Variables,在PHP中,您可以执行以下惊人/可怕的操作: $a = 1; $b = 2; $c = 3; $name = 'a'; echo $$name; // prints 1 var a = 1, b = 2, c = 3; var obj = {}; obj['whatever'] = 'There\'s no need to store even more stuff in a global object.'; console.log(obj['whatever']); 有

在PHP中,您可以执行以下惊人/可怕的操作:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
var a = 1,
    b = 2,
    c = 3;
var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';

console.log(obj['whatever']);
有没有办法用Javascript做这样的事情


例如,如果我有一个
var name='变量名'
我可以获取一个名为
name
的变量引用吗?

您可以使用窗口对象获取它

window['myVar']

窗口
引用了您正在使用的所有全局变量和全局函数

eval
是一种选择

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

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

警告:请注意,如果您不知道自己在做什么,则不建议使用
eval()
函数,因为它会带来多个安全问题。除非绝对必要,否则使用其他东西。有关更多信息,请参见。

因为ECMA-/Javascript都是关于
对象和
上下文的(它们也是某种对象),所以每个变量都存储在一个名为变量-(或者在函数的情况下,激活对象)

因此,如果您创建如下变量:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
var a = 1,
    b = 2,
    c = 3;
var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';

console.log(obj['whatever']);
全局范围(=无函数上下文)中,将这些变量隐式写入全局对象(=浏览器中的
窗口

可通过使用“点”或“括号”符号访问:

var name = window.a;

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

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
(=窗口)。此示例将分别警告
未定义
1
。如果我们要替换
this.a=1;此.b=2
带有:

var a = 1,
    b = 2;
两个警报输出都未定义。在这种情况下,变量
a
b
将从
foobar
存储在激活对象中,我们无法访问它们(当然,我们可以通过调用
a
b
直接访问它们)


试试这个…

他们的意思是不,你不能。 没有办法完成它。 所以你有可能做这样的事情

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)

在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"]);

只是不知道一个糟糕的答案会得到这么多选票。答案很简单,但你把它弄复杂了

// 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
因此,myVariable的值“coco”变为变量coco


因为全局范围中的所有变量都是窗口对象的属性。

如果不想使用全局对象,如窗口或全局(节点),可以尝试以下操作:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
var a = 1,
    b = 2,
    c = 3;
var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';

console.log(obj['whatever']);

我需要动态地绘制多个表单数据,对象方式运行良好

var forms = {}
然后在我需要创建表单数据的循环中使用

forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);
2019年

TL;博士
  • eval
    运算符可以在其调用的上下文中运行字符串表达式,并从该上下文返回变量
  • literal对象
    理论上可以通过写入:
    {[varName]}
    实现,但它被定义阻止了
所以我遇到了这个问题,这里的每个人都只是在玩弄,没有找到真正的解决办法。但是@Axel Heider有一个很好的方法

解决方案是
eval
。 几乎被遗忘的操作员。(我想大多数人都是带()的

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
将运行。 避免代码中不必要的意外<代码>评估
非常强大 但我相信你已经知道了

顺便说一句,如果合法的话,我们可以使用
literal object
来捕获变量名和值,但是我们不能将计算属性名和属性值合并起来,很遗憾,速记是无效的

functopn example( varName ){
    var var1 = 'foo', var2 ='bar'

    var capture = {[varName]}

}

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

使用对象也很好

var a=123
var b=234
var temp = {"a":a,"b":b}
console.log(temp["a"],temp["b"]);

虽然这是一个公认的答案,但我想补充一点:

在ES6中,使用
不起作用:

/*这不起作用*/
让t=“天蓝色”,
m=“黄金”,
b=“番茄”;
让颜色=窗口[“b”];

控制台。日志(颜色)对于那些需要导出动态命名变量的人来说,这是另一种选择

export {
  [someVariable]: 'some value',
  [anotherVariable]: 'another value',
}

// then.... import from another file like this:
import * as vars from './some-file'
另一种方法是简单地创建一个对象,该对象的键是动态命名的

const vars = { [someVariable]: 1, [otherVariable]: 2 };

// consume it like this
vars[someVariable];

最好使用创建名称空间并在其中声明变量,而不是将其添加到全局对象。我们还可以创建一个函数来获取和设置值

请参阅以下代码段:

//creating a namespace in which all the variables will be defined.
var myObjects={};

//function that will set the name property in the myObjects namespace
function setName(val){
  myObjects.Name=val;
}

//function that will return the name property in the myObjects namespace
function getName(){
  return myObjects.Name;
}

//now we can use it like:
  setName("kevin");
  var x = getName();
  var y = x;
  console.log(y)  //"kevin"
  var z = "y";
  console.log(z); //"y"
  console.log(eval(z)); //"kevin"

通过类似的方式,我们可以声明和使用多个变量。虽然这将增加代码行数,但代码将更健壮,更不容易出错。

这将与您在php中所做的完全相同:

var a = 1;
var b = 2;
var ccc = 3;
var name = 'a';
console.log( window[name] ); // 1

不用说,这个比eval更安全