在 JavaScript 中使用动态变量名

IT技术 javascript dynamic-variables
2021-01-06 15:50:48

在 PHP 中,你可以做这样惊人/可怕的事情:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1

有没有办法用 Javascript 做这样的事情?

例如,如果我有一个名称var name = 'the name of the variable';,我可以获得对变量的引用name吗?

6个回答

由于 ECMA-/Javascript 都是关于Objectsand Contexts(它也是某种对象),所以每个变量都存储在一个称为Variable-(或在函数的情况下,激活对象)中。

因此,如果您创建这样的变量:

var a = 1,
    b = 2,
    c = 3;

全局范围内(= 无函数上下文),您将这些变量隐式写入全局对象(=window在浏览器中)。

这些可以通过使用“点”或“括号”符号来访问:

var name = window.a;

或者

var name = window['a'];

这仅适用于在这种特定情况下的全局对象,因为变量对象中的全局对象window对象本身。在函数的 Context 中,您不能直接访问Activation Object例如:

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(=window)。此示例将分别发出警报undefined1如果我们将替换this.a = 1; this.b = 2为:

var a = 1,
    b = 2;

两个警报输出都将是未定义的。在这种情况下,变量aandb将存储在 Activation Object from 中foobar,我们无法访问它(当然我们可以通过调用aand直接访问它们b)。

用括号符号指出我正确的方向。被困在只考虑点符号。
2021-02-08 15:50:48
如果您需要访问嵌套属性,请查看stackoverflow.com/questions/4244896/...
2021-02-13 15:50:48
@Kokodoko——因为不是“上下文”或对函数执行上下文的引用(无法引用执行上下文,ECMA-262 禁止这样做)。是由函数的调用方式(或通过bind)设置的,它只是一个与可访问的执行上下文无关的对象。
2021-02-20 15:50:48
但是如果我的动态变量在函数中是局部的呢?例如: function boink() { var a = 1; // 这将不起作用 var dynamic = this['a']; // 这也不起作用 var dynamic = ['a']; }
2021-02-27 15:50:48
另一个很酷的事情是,通过这种方式,您可以为任何全局级别的函数添加回调(开始/结束)。
2021-03-02 15:50:48

eval 是一种选择。

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

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

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

不,它不应该,因为 eval 是邪恶的。永远不要使用评估!
2021-02-21 15:50:48
以下是如何使用 eval 创建动态变量:stackoverflow.com/a/13291766/5528600
2021-02-24 15:50:48
@EasyBB - 如果您打算说永远不要使用某些东西,我无法解释原因。我有一种情况,除了 eval() 之外,我想不出任何其他方法来完成我正在做的事情
2021-03-01 15:50:48
通过javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval ---“让我们考虑最常反对使用 eval 的论点:1)它需要编译,因此很慢 2)如果恶意脚本进入了 eval 参数?3)它看起来很丑 4)它继承了执行上下文和调用它的范围的绑定“
2021-03-06 15:50:48
Eval 会对最终用户造成攻击风险,我们认为它在技术上并不是邪恶的,而是在丢失的情况下被误解和误用。我已经看到 php 响应中包含文字变量,然后使用 eval 来运行它。尽管在这种情况下不应该使用它,因为有更好的方法。手头的这个问题 eval 根本不应该使用,因为总体上有更好的方法,我相信我们很多人都知道这一点。
2021-03-09 15:50:48

您可以使用 window 对象来获取它。

window['myVar']

window 具有对您正在使用的所有全局变量和全局函数的引用。

不用说,这个比 eval() 更安全。
2021-02-08 15:50:48
window是什么样子state那真的很有帮助。
2021-02-13 15:50:48

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

// 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);
在 Express.js 路由中工作得很好
2021-02-08 15:50:48
这不起作用。undefined如果你把它放在一个函数中并用一个对象(用new运算符或点符号)调用它,它会输出到警报框
2021-03-03 15:50:48
“在我们使用的函数中this” - 如果您想以这种方式访问全局变量,最好明确并使用window对象,而不是this. this是模棱两可的。
2021-03-05 15:50:48
但是在函数内部,您不能使用this或其他任何东西来访问type示例中的变量,如果您在另一个变量中有它的名称:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')将显示article,而不是something else这就是“复杂答案”所解释的。
2021-03-06 15:50:48
感谢 @Terry,这在 Vue 中完美运行。当您声明了多个数据属性,并且您想要一种方法来决定要定位哪个数据属性时,您只需像这样传递属性名称: changeProperty(propertyName) { this[propertyName] = 1; } changeProperty("bar") changeProperty("baz")
2021-03-06 15:50:48

这是一个例子:

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对象的属性。