Javascript “Variable Variables”: come assegnare una variabile in base a un’altra variabile?

Ho un set di variabili di contatore globali in Javascript:

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

eccetera

Quindi ho una funzione Javascript che accetta un numero ‘indice’ che si associa a quei contatori globali. All’interno di questa funzione, ho bisogno di leggere e scrivere su quei contatori globali usando il valore ‘indice’ passato alla funzione.

Esempio di come mi piacerebbe che funzionasse, ma ovviamente non funziona affatto:

 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 } } 

Spero che quello che sto cercando di realizzare sia chiaro. Se no, proverò a chiarire. Grazie.

MODIFICA:

Non sto cercando di incrementare il nome del contatore, ma piuttosto il valore che contiene il contatore.

Sembra un array per me o mi manca qualcosa?

 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 } } 

Assicurati che l’indice sia davvero un numero intero, altrimenti potrebbe verificarsi un caos.

Modifica : altri hanno sottolineato che dovresti usare un array se puoi. Ma se sei bloccato con le variabili globali nominate, allora l’approccio sopra funzionerà.

Modifica : bobince sottolinea che è ansible utilizzare l’object finestra per accedere a globals per nome, e quindi merita alcun credito per quanto segue:

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

Altre risposte hanno detto “non usare eval() “, ma non perché. Ecco una spiegazione da MDC :

Non usare eval!

eval () è una funzione pericolosa, che esegue il codice passato con i privilegi del chiamante. Se esegui eval () con una stringa che potrebbe essere interessata da una parte malintenzionata, potresti finire con l’esecuzione di codice dannoso sul computer dell’utente con le autorizzazioni della tua pagina web / estensione.

Esistono alternative sicure a eval () per casi d’uso comune.

La eval() javascript eval() ti consentirà di farlo. Tuttavia è generalmente disapprovato. La tua domanda non escludeva esplicitamente gli array. Gli array sarebbero sicuramente più appropriati per lo schema che hai descritto.