如何在JavaScript中动态引用变量

9

我正在尝试在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个回答

10

不要将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];

1
我正要点击发布按钮,突然弹出了“已发布50亿条新回答”的提示。这基本上就是我要说的内容。 - Patricia

5

据我所知,实现这个目标的唯一方法是将所有的 amtgc1# 变量放入一个对象中,例如:

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

那么你可以像这样引用它:

myVars["amtgc" + step];

4
怎么样:
var dataString = dataString + eval('amtgc1' + step);

4
这将起作用,但 eval 是有害的,应该尽可能避免使用它,可以考虑改用数组或对象字面量语法。 - Dan Davies Brackett
@DDaviesBrackett - 你认为jQuery内部使用了什么呢?;-) - Jakub Konecki
@Jakub 是的,jQ确实使用eval,但不是为了避免使用数组! - Dan Davies Brackett
@DDaviesBrackett - 我同意 eval 可以被滥用,从而导致可怕的代码,但是我建议的 eval 不会导致性能不佳或难以管理的代码。 - Jakub Konecki
3
使用eval()会明显阻碍运行时可用的优化,因此应始终考虑它是性能问题。 - Pointy
显示剩余3条评论

1

确实,eval()并不总是推荐使用的,但它可以工作。否则,根据作用域,你可以像JavaScript中的对象一样引用大多数内容。也就是说,以下是你可以做的示例。

全局作用域

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

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

0

我已经构建了一种方法,可以使用对象来存储键值来解决这个问题,其中键将是任务的引用,值将是操作(函数),您可以在循环内部使用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

0
如果您的amtgc1*变量被定义为对象的属性,则可以通过名称引用它们。假设它们在全局范围内声明,它们将成为window对象的成员。
        var inc=7; 
        var step=0; 
        while(step < inc){ 
            var dataString = dataString + window['amtgc1'+(step+1)]; 
            var step = step+1; 
        } 

如果它们被定义在不同的范围内(在函数内),但并不属于任何其他对象,那么您只能使用 eval,这通常被认为是不好的。
此外,欢呼循环!
        var inc=7; 
        for ( var step=0; step < inc; step++ ){ 
            var dataString = dataString + window['amtgc1'+(step+1)]; 
         } 

0

没有经过测试,但我不明白为什么你不能做这个...

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


1
只有变量是带有ID的DOM元素时才成立。 - Sean McMillan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接