Как ссылаться на переменную динамически в JavaScript

Я пытаюсь ссылаться на переменную динамически в JavaScript

Я пытаюсь вызвать переменную amtgc1 # (где # варьируется от 1 до 7),

Я использую оператор while для циклического прохождения, и значение переменной подсчета в моем операторе while соответствует последней цифре переменной, которую я пытаюсь вызвать.

Например:

            var inc=3;
            var step=0;
            while(step < inc){
                var dataString = dataString + amtgc1#;
                var step = step+1;
            }

Где # основано на значении переменной «step». Как мне это сделать? Любая помощь приветствуется! Спасибо!!

Ответы на вопрос(7)

енные amtgc1 # в такой объект, как:

myVars = {
  amtgc1: 1234,
  amtgc2: 12345,
  amtgc3: 123456,
  amtgc4: 1234567
};

Тогда вы можете ссылаться на это как

myVars["amtgc" + step];

Если твойamtgc1* Переменные определяются как свойство объекта, вы можете ссылаться на них по имени. Предполагая, что они объявлены в глобальной области, они будут членамиwindow объект.

        var inc=7; 
        var step=0; 
        while(step < inc){ 
            var dataString = dataString + window['amtgc1'+(step+1)]; 
            var step = step+1; 
        } 

Если они определены в другой области (в пределах функции), но не принадлежат ни к какому другому объекту, вы застряли сeval, что в целом считается плохим.

Кроме того, ураfor петля!

        var inc=7; 
        for ( var step=0; step < inc; step++ ){ 
            var dataString = dataString + window['amtgc1'+(step+1)]; 
         } 

Я построил способ, которым вы могли бы решить эту проблему, используя объекты для хранения значений ключа, где ключом будет ссылка на задачу, а значением будет действие (функция), и вы можете использовать if внутри цикла для проверки текущее задание и запуск действий.

Если вы хотите сравнить динамически сцепленные строки с «переменным», вам следует использовать функцию eval ().

/* store all tasks references in a key value, where key will be
*  the task reference and value will be action that the task will 
*  Execute
*/
var storeAllTasksRefer = {

    amtgc11:function(){ alert("executing task amtgc11"); },
    amtgc112:function(){ alert("executing task amtgc112"); },
    "amtgc1123":"amtgc1123"
    // add more tasks here...

};

var inc = 7;
var step = 1;
var dataString = 'amtgc1';

while(step <= inc){

     var dataString = dataString + step;
     //alert(dataString); // check its name;
     step = step+1;

     // check if it is my var
    if( dataString  == 'amtgc112' ){

         // here I will reference my task
         storeAllTasksRefer.amtgc112();             


     }// end if

     /* you can also compare dynamically using the eval() function */
     if('amtgc1123' == eval('storeAllTasksRefer.'+dataString)){

        alert("This is my task: "+ eval('storeAllTasksRefer.'+dataString));

     } // end this if

} // end while

Вот живой пример:http://jsfiddle.net/danhdds/e757v8ph/

Ссылка на функцию eval ():http://www.w3schools.com/jsref/jsref_eval.asp

$('#amtgc1' + step).whatever();

 Sean McMillan30 сент. 2010 г., 22:46
Только если переменные являются элементами dom с идентификаторами.
Решение Вопроса

Вместо того, чтобы определятьamtgc1[1-7] как 7 различных переменных, создайте их как массив. Итак, ваш серверный код будет выдавать:

var amtgc1 = [<what used to be amtgc11>,<what used to be amtgc12>, ...insert the rest here...];

Затем вы можете ссылаться на них в цикле, используя синтаксис массива:

var dataString = dataString + amtgc1[step];
 Patricia30 сент. 2010 г., 22:07
Я как раз собирался нажать на Пост, когда «5 миллиардов новых ответов было опубликовано». это в значительной степени то, что я собирался сказать.

Как насчет:

var dataString = dataString + eval('amtgc1' + step);
 Jakub Konecki30 сент. 2010 г., 22:18
@DDaviesBrackett - я согласен с тем, что можно легко злоупотреблять eval, что может привести к ужасному коду, но предложенное мной eval не приведет к ИМХО низкой производительности или сложному управлению кодом.
 Dan Davies Brackett30 сент. 2010 г., 22:09
это будет работать, но eval - это зло, и его следует избегать, когда будет достаточно переключения на массив или объектно-буквальный синтаксис.
 Chris Bier30 сент. 2010 г., 22:09
Почему это зло?
 Jakub Konecki30 сент. 2010 г., 22:13
@DDaviesBrackett - а как вы думаете, что jQuery использует внутри? ;-)
 Pointy24 июн. 2014 г., 14:42
С помощьюeval() определенно препятствует оптимизации, доступной для среды выполнения, и поэтому всегда должно рассматриваться как проблема с производительностью.
 Chris Bier30 сент. 2010 г., 22:16
Я бы хотел принять и то и другое, но с точки зрения чистоты синтаксиса мне придется пойти с DDavies. Спасибо Якуб! Я проголосовал за тебя!
 Dan Davies Brackett30 сент. 2010 г., 22:13
@Chris B. Поиск в Google «eval is evil» даст вам много хороших отзывов о том, почему это так. Это первое:blogs.msdn.com/b/ericlippert/archive/2003/11/01/53329.aspx по сути, eval приводит к грязному синтаксису, который трудно поддерживать и (потому что он использует интерпретатор) чрезвычайно медленный.
 Dan Davies Brackett30 сент. 2010 г., 22:14
@Jakub да, jQ использует eval, но не как способ избежать использования массивов!
 Chris Bier30 сент. 2010 г., 22:09
Это самый простой способ сделать это, и это работает. Я попробовал это только сейчас, это работает отлично. Мне не нужно менять какой-либо из моих существующих кодов. Спасибо Якуб!

Правда, чтоeval() не всегда рекомендуется, но это будет работать. В противном случае, в зависимости от области действия, вы можете ссылаться на большинство вещей, таких как объект в JavaScript. Тем не менее, вот примеры того, что вы можете сделать.

Глобальная сфера

var MyGlobalVar = 'secret message';
var dynamicVarName = 'MyGlobalVar';
console.log(window.[dynamicVarName]);

Область действия функции

function x() {
  this.df = 'secret';
  console.log(this['df']);
}
x();

Ваш ответ на вопрос