在PHP中,你可以做这样惊人/可怕的事情:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
有什么方法可以用Javascript做这样的事情吗?
例如,如果我有一个var name = '变量的名称';我可以得到一个引用的变量与名称?
在PHP中,你可以做这样惊人/可怕的事情:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
有什么方法可以用Javascript做这样的事情吗?
例如,如果我有一个var name = '变量的名称';我可以得到一个引用的变量与名称?
当前回答
在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"]);
其他回答
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解决方案,它不依赖于运行时环境的全局this。使用对象解构实现简单。
const dynamicVar = (nameValue, value) => {
const dynamicVarObj = {
[nameValue]: value
}
return dynamicVarObj;
}
const nameToUse = "myVar";
const value = 55;
const { myVar } = dynamicVar(nameToUse, value);
console.log(myVar); // prints 55
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);
试试这个…
由于ECMA-/Javascript是关于对象和上下文的(也是某种对象),每个变量都存储在一个所谓的变量中(或者在函数的情况下,激活对象)。
如果你创建这样的变量:
var a = 1,
b = 2,
c = 3;
在Global作用域(= NO函数上下文)中,您隐式地将这些变量写入Global对象(=浏览器中的窗口)。
这些可以通过使用“点”或“括号”符号来访问:
var name = window.a;
or
var name = window['a'];
这只适用于这个特定实例中的全局对象,因为全局对象的变量对象是窗口对象本身。在函数的上下文中,您不能直接访问激活对象。例如:
函数foobar() { 这一点。A = 1; 这一点。B = 2; Var name = window['a'];// === undefined console.log(名称); Name = this['a'];// === 1 console.log(名称); } 新foobar ();
New创建一个自定义对象(context)的新实例。如果没有new,函数的作用域也是global (=window)。这个例子将分别警告为undefined和1。如果我们替换这个。A = 1;这一点。B = 2 with:
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中实现的那样。