2011-03-03 128 views

回答

100

沒有單一的解決方案爲此(好吧,有eval,但不要認真考慮)。可以通過window動態訪問全局變量,但這對於函數本地的變量不起作用。

幾乎總是比使用變量變量更好的解決方案!相反,您應該查看data structures併爲您的問題選擇正確的一個。

如果你有一個固定的名字,如

// BAD 
 
var foo = 42; 
 
var bar = 21; 
 

 
var key = 'foo'; 
 
console.log(eval(key));

商店的名稱/值作爲對象的屬性和使用括號符號找一找動態添加:

// GOOD 
 
var obj = { 
 
    foo: 42, 
 
    bar: 21, 
 
}; 
 

 
var key = 'foo'; 
 
console.log(obj[key]);


如果你已經 「連續」 編號的變量,如

// BAD 
 
var foo1 = 'foo'; 
 
var foo2 = 'bar': 
 
var foo3 = 'baz'; 
 

 
var index = 1; 
 
console.log(eval('foo' + index));

,那麼你應該使用陣列代替,簡單地使用索引來訪問相應的值:

// GOOD 
 
var foos = ['foo', 'bar', 'baz']; 
 
var index = 1; 
 
console.log(foos[index - 1])

36

如果你不顧一切地做到這一點,你可以嘗試使用eval():

var data = "testVariable"; 
eval("var temp_" + data + "=123;"); 
alert(temp_testVariable); 

或者使用窗口對象:

var data = "testVariable"; 
window["temp_" + data] = 123; 
alert(window["temp_" + data]); 

http://www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript

+12

+1窗口解決方案 – DanMan 2013-05-14 13:53:35

+0

'eval'無法在嚴格模式下創建局部變量。不過,間接調用可以創建全局變量。 – Oriol 2016-11-27 22:41:41

1

當然可以,但不要。變量必須是全局的。

var killingFunction = 'alert' 
var killMeNow = 'please' 
var please = 'You have been killed!' 
this[killingFunction](this[killMeNow]) 
1
var vars = {}; 
var var_name = "str"; 
vars[var_name] = "working"; 
console.log(vars["str"]); 
3

引用變量在JavaScript中只有一個字符串,你可以使用

window['your_variable_name'] 

您可以設置和參考變量和對象變量太多。

-2

我們可以這樣使用。

var objectName[key]{ 
    'someDataName':'thatData', 
    'someOtherDataName':'thisData' 
} 

如果你想獲得的價值值,以便可以使用循環

for(key in objectName){ 
    objectName[key].someDataName; 
    objectName[key].someOtherDataName; 

} 
+2

* SyntaxError:意外的標記[* – Quentin 2017-01-13 23:29:45

0

您可以使用JavaScript eval(str)功能。

這個函數做的是將提供的字符串轉換成JS代碼,然後執行它。

例如:

eval("console.log('hello world')"); // Logs hello world 

所以使用它作爲一個變量的變量,你可以做到以下幾點:

var a = "hello"; 
var hello = "world"; 
console.log(a + " " + eval(a)); // Logs hello world 

這將產生完全相同的輸出:

console.log(a + " " + hello); // Logs hello world 

(示例取自the PHP manual on variable variables。)

0

與PHP不同,JavaScript不提供對globals數組(包含對當前聲明的所有變量名的引用)的訪問。因此,JavaScript不提供對變量變量的本地支持。但是,只要將所有變量定義爲數組或對象的一部分,就可以模擬此功能。這反過來會爲你創造一個gloabls陣列。例如,而不是像這樣在全球範圍內聲明變量hello

var hello = 'hello world'; 

讓我們將其封裝對象內。我們將調用該對象VV(可變變量):

var vv = { 
    'hello': 'hello world', 
    //Other variable variables come here. 
}, 
referToHello = 'hello'; 

現在,我們可以通過它的指數指的是可變的,因爲可以使用變量來提供數組索引,我們實際上利用一個可變的變量:

console.log(vv[referToHello]); //Output: hello world 

的回答你的問題

讓我們將這個應用到你原來的問題提供的代碼:

var vv = { 
     'x': 'variable', 
     'variable': 'hello world!' 
    }; 
    console.log(vv[vv['x']]); //Displays "hello, world!" 

實際使用

雖然前面的代碼可能會出現可笑的繁瑣和不切實際的,也有使用這種類型的封裝在JavaScript變量變量的實際用途。在下面的示例中,我們使用相同的概念來獲取未定義數量的HTML元素的ID。

var elementIds = [], 
     elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc. 
     elements.forEach((element) => { 
      elementIds[element] = document.getElementById(element); 
     }); 

這個例子聲明變量變量根據各元素的ID(在elementIds鍵),和將所述元件的節點指定爲每個變量的值。而且,由於在JavaScript中使用全局變量通常是不鼓勵的,因此給變量賦一個獨特的範圍(在這個例子中,聲明它們在elementIds數組中)不僅是整潔的,而且更負責任。