Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.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']

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

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

window['myVar']

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

eval
是一种选择

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

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

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

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
直接访问它们)。

因为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
。如果我们将
此.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中实现的函数类似的函数。

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

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

在Javascript中,您可以使用所有属性都是键值对这一事实。jAndy已经提到了这一点,但我认为他的回答没有说明如何利用它

通常,您不会尝试创建一个变量来保存变量名,而是尝试生成变量名并使用它们。PHP使用
$$var
表示法来实现这一点,但Javascript不需要这样做,因为属性键可以与数组键互换

var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);
给我们123