2010-09-30 22 views
7

我想在JavaScript如何引用變量動態地在javascript

我試圖調用動態變量引用變量是amtgc1#(其中#1-7而異)

我使用while語句來循環,while語句中計數變量的值與我試圖調用的變量的最後一個數字相對應。

例如:

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

其中#是基於可變 「步驟」 的值。我如何去做這件事?任何幫助表示讚賞!謝謝!!

回答

7

相反而不是將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]; 
+0

我正要打中立柱,當「五個十億新的答案已張貼」彈出。這幾乎是我想說的。 – Patricia 2010-09-30 20:07:29

4

你可以做到這一點的唯一方法(據我所知)是拋出所有amtgc1#瓦爾的一個對象,如:

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

然後,你可以參考它像

myVars["amtgc" + step]; 
2

如何:

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

這會起作用,但eval是邪惡的,當切換到數組或對象 - 文字語法就足夠時應該避免。 – 2010-09-30 20:09:11

+0

這是最簡單的方法,它的工作原理。我剛纔嘗試過,它完美地工作。我不必更改任何現有的代碼。謝謝Jakub! – 2010-09-30 20:09:36

+0

爲什麼它是邪惡的? – 2010-09-30 20:09:57

0

沒有測試,但是可以你明白爲什麼你不能這樣做...

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

+1

只有當變量是帶有ID的dom元素時。 – 2010-09-30 20:46:17

0

如果您的amtgc1*變量被定義爲對象的屬性,則可以按名稱引用它們。假設它們在全局範圍內聲明,它們將成爲window對象的成員。

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

如果它們是在不同的範圍內定義(函數內),但不屬於任何其他對象,你堅持eval,這通常被認爲是不好的。

也,hooray for循環!

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

我已經建立了,你可以使用對象來存儲密鑰值,其中的關鍵將是參照任務和值將是動作(功能)解決這個問題的一種方法,你可以使用如果在循環內部檢查當前任務並觸發操作。

如果你想比較動態連接字符串與「變量」,你應該使用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

這是事實,eval()並不總是建議,但是這會工作。否則,取決於範圍,你可以引用大部分東西,比如JavaScript中的一個對象。這就是說,這裏是你可以做的事情的例子。

全球範圍

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

功能範圍

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