【问题标题】:How to reference a variable dynamically in javascript如何在javascript中动态引用变量
【发布时间】:2011-04-19 13:28:30
【问题描述】:

我正在尝试在 javascript 中动态引用变量

我试图调用的变量是 amtgc1#(其中 # 从 1 到 7 不等)

我正在使用 while 语句进行循环,并且我的 while 语句中的计数变量的值与我试图调用的变量的最后一位相对应。

例如:

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

其中#基于变量“step”的值。我该怎么做呢?任何帮助表示赞赏!谢谢!!

【问题讨论】:

    标签: javascript variables dynamic


    【解决方案1】:

    与其将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];
    

    【讨论】:

    • 当“已发布 50 亿个新答案”弹出时,我正要点击 Post。这就是我要说的。
    【解决方案2】:

    您可以做到这一点的唯一方法 (afaik) 是将所有 amtgc1# 变量放入一个对象中,例如:

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

    然后你可以像引用它

    myVars["amtgc" + step];
    

    【讨论】:

      【解决方案3】:

      怎么样:

      var dataString = dataString + eval('amtgc1' + step);
      

      【讨论】:

      • 这会起作用,但是 eval 是邪恶的,当切换到数组或对象文字语法就足够了时应该避免使用。
      • 这是最简单的方法,而且很有效。我刚才试了一下,效果很好。我不必更改任何现有代码。谢谢雅库布!
      • @DDaviesBrackett - 你认为 jQuery 内部使用了什么? ;-)
      • @Chris B. 在谷歌搜索“eval is evil”会给你很多关于它为什么会的好消息。这是第一个:blogs.msdn.com/b/ericlippert/archive/2003/11/01/53329.aspx 本质上, eval 会导致难以维护的混乱语法(因为它嵌套了解释器)非常慢。
      • 使用eval() 肯定会阻碍运行时可用的优化,因此应始终将其视为性能问题。
      【解决方案4】:

      的确,eval() 并不总是被推荐,但这会奏效。否则,根据范围,您可以引用大多数内容,例如 JavaScript 中的对象。也就是说,这里有一些你可以做的例子。

      全球范围

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

      功能范围

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

      【讨论】:

        【解决方案5】:

        未测试,但不明白为什么不能这样做...

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

        【讨论】:

        • 仅当变量是具有 ID 的 dom 元素时。
        【解决方案6】:

        如果您的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)]; 
                 } 
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2015-04-14
            • 1970-01-01
            • 2011-02-23
            • 1970-01-01
            • 1970-01-01
            • 2013-10-31
            • 1970-01-01
            • 1970-01-01
            • 2011-12-12
            相关资源
            最近更新 更多