Javascript "Переменные переменные": как назначить переменную на основе другой переменной? - PullRequest
4 голосов
/ 27 февраля 2009

У меня есть набор переменных глобального счетчика в 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 ]

21 голосов
/ 27 февраля 2009

Выглядит как массив для меня, или я что-то упустил?

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 */ 
   }
}
10 голосов
/ 27 февраля 2009
function process(index) {
    // do some processing
    var counter;
    eval('counter = ++counter_'+index);
    if (counter == 13)
    {
        // do other stuff
    }
}

Убедитесь, что индекс действительно является целым числом, иначе может произойти хаос.

Редактировать : Другие отметили, что вы должны использовать массив, если можете. Но если вы застряли с именованными глобальными переменными, то вышеуказанный подход будет работать.

Редактировать : Бобинсе указывает, что вы можете использовать объект окна для доступа к глобальным именам по имени, и поэтому заслуживает любой оценки за следующее:

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

В других ответах говорилось "не используйте eval()", но не почему. Вот объяснение от MDC :

Не используйте eval!

eval () - опасная функция, которая выполняет код, переданный с привилегии звонящего. Если вы бежите eval () со строкой, которая может быть злоумышленник может в конечном итоге запустить вредоносный код на компьютер пользователя с разрешениями Ваш веб-сайт / расширение.

Есть безопасные альтернативы eval () для общих случаев использования.

9 голосов
/ 27 февраля 2009

Функция eval() javascript позволит вам сделать это. Однако, как правило, это осуждается. Ваш вопрос явно не исключает массивы. Массивы определенно подойдут для описанного вами шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...