我知道在PHP中可能有「可變」變量。例如Javascript中的「變量」變量?
$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"
這是可能的JavaScript?它將如何完成?
我知道在PHP中可能有「可變」變量。例如Javascript中的「變量」變量?
$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"
這是可能的JavaScript?它將如何完成?
沒有單一的解決方案爲此(好吧,有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])
如果你不顧一切地做到這一點,你可以嘗試使用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
當然可以,但不要。變量必須是全局的。
var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);
引用變量在JavaScript中只有一個字符串,你可以使用
window['your_variable_name']
您可以設置和參考變量和對象變量太多。
我們可以這樣使用。
var objectName[key]{
'someDataName':'thatData',
'someOtherDataName':'thisData'
}
如果你想獲得的價值值,以便可以使用循環
for(key in objectName){
objectName[key].someDataName;
objectName[key].someOtherDataName;
}
* SyntaxError:意外的標記[* – Quentin 2017-01-13 23:29:45
您可以使用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
與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
數組中)不僅是整潔的,而且更負責任。
+1窗口解決方案 – DanMan 2013-05-14 13:53:35
'eval'無法在嚴格模式下創建局部變量。不過,間接調用可以創建全局變量。 – Oriol 2016-11-27 22:41:41