Javascript“变量变量”:如何根据另一个变量分配变量?

IT技术 javascript variables
2021-02-12 03:57:00

我在 Javascript 中有一组全局计数器变量:

var counter_0 = 0;
var counter_1 = 0;
var counter_2 = 0;

等等

然后我有一个 Javascript 函数,它接受一个映射到这些全局计数器的“索引”号。在这个函数中,我需要使用传递给函数的“索引”值来读取和写入这些全局计数器。

我希望它如何工作的示例,但当然根本不起作用:

function process(index) {
    // do some processing

    // if 'index' == 0, then this would be incrementing the counter_0 global variable
    ++counter_+index; 

    if (counter_+index == 13)
    {
        // do other stuff
    }
}

我希望我想要完成的事情很清楚。如果不是,我会尽力澄清。谢谢。

编辑澄清:

我不是要增加计数器的名称,而是要增加计数器包含的值。

3个回答

对我来说看起来像一个数组,还是我错过了什么?

var counters = [0,0,0];

function process(index) {
   ++counters[index]; 
      /* or ++counters[index]+index, not sure what you want to do */
   if (counters[index] === 13) { 
      /* do stuff */ 
   }
}
function process(index) {
    // do some processing
    var counter;
    eval('counter = ++counter_'+index);
    if (counter == 13)
    {
        // do other stuff
    }
}

确保索引确实是一个整数,否则可能会发生混乱。

编辑:其他人指出,如果可以,您应该使用数组。但是,如果您坚持使用命名的全局变量,那么上述方法将起作用。

编辑:bobince 指出您可以使用 window 对象按名称访问全局变量,因此值得称赞以下几点:

function process(index) {
    // do some processing
    var counter = ++window['counter_' + index];
    if (counter == 13)
    {
        // do other stuff
    }
}

其他答案说“不要使用eval()”,但不是为什么。这是MDC的解释

不要使用评估!

eval() 是一个危险的函数,它以调用者的权限执行它传递的代码。如果您使用可能受到恶意方影响的字符串运行 eval(),您最终可能会在具有您的网页/扩展程序权限的用户计算机上运行恶意代码。

对于常见用例,有 eval() 的安全替代方案。

即使坚持使用命名变量,您也不需要也不应该使用 eval()。window['counter_'+index] 将检索全局变量,就像任何其他属性访问一样。
2021-03-26 03:57:00

eval()javascript函数可以让你做到这一点。然而,它通常是不受欢迎的。您的问题没有明确排除数组。数组肯定更适合您所描述的模式。