2011-04-10 105 views
181

我查找了解決方案,但找不到任何工作。將字符串轉換爲JavaScript中的變量名稱

我有一個變量叫onlyVideo

"onlyVideo"該字符串被傳入一個函數。我想將函數內部的變量onlyVideo設置爲某種東西。我怎樣才能做到這一點?

(有許多的變量可以被稱爲進入功能,所以我需要它的工作動態,而不是硬編碼if陳述。)

編輯:有可能是做你的更好的方法試圖去做。我在JavaScript冒險中很早就提出了這個問題。查看JavaScript對象的工作方式。

一個簡單的介紹:

// create JavaScript object 
var obj = { "key1": 1 }; 

// assign - set "key2" to 2 
obj.key2 = 2; 

// read values 
obj.key1 === 1; 
obj.key2 === 2; 

// read values with a string, same result as above 
// but works with special characters and spaces 
// and of course variables 
obj["key1"] === 1; 
obj["key2"] === 2; 

// read with a variable 
var key1Str = "key1"; 
obj[key1Str] === 1; 
+5

做?你確定你需要將它設置爲一個正常的局部變量,並且Object(哈希)不起作用? – Dogbert 2011-04-10 18:32:33

+0

嗯...我還是不太明白爲什麼你想在一個有數組的世界裏做到這一點。無論如何,你的一些代碼和解釋會有很大的幫助。 – 2011-04-10 18:34:12

+0

我認爲我們需要更多關於你的最終目標是什麼的詳細信息 – mcgrailm 2011-04-10 18:35:32

回答

207

如果它是一個全局變量,然後window[variableName] 或你的情況window["onlyVideo"]應該做的伎倆。

+21

即使不是全球性的,你也可以通過'scope [property]'甚至'this [property]來訪問它' – 2014-07-22 21:38:08

+6

@WojciechBednarski:不要混淆範圍和上下文。 'this'是上下文,它指向的取決於函數的調用方式。在JS中,除非你啓用嚴格模式,'this'變成'undefined'並且會拋出一個錯誤,否則50%的時間'this'是'window'。範圍是完全不同的東西,它不是一個對象(除了全局範圍,它是由'window'對象鏡像的) – slebetman 2015-06-26 03:00:23

+2

在'WebWorkers'中不起作用(其中'self'受全局範圍影響,就像它在瀏覽器中一樣,它等於'window')和Node.js,其中'global'是你想要的變量。而且它更適用於本地範圍,比如函數體。 – 2015-10-11 23:00:03

123

JavaScript有這種場合的eval()功能:

function (varString) { 
    var myVar = eval(varString); 
    // ..... 
} 

編輯:對不起,我想我得太快脫脂的問題。這隻會讓你的變量,將其設爲您使用字符串需要

function SetTo5(varString) { 
    var newValue = 5; 
    eval(varString + " = " + newValue); 
} 

,或者:

function SetToString(varString) { 
    var newValue = "string"; 
    eval(varString + " = " + "'" + newValue + "'"); 
} 

但我想有是完成你正在尋找一個更合適的方法?我不認爲eval()是你真正想使用的東西,除非有很好的理由。 eval()

+3

是的,我會去這個,而不是使用窗口(它有一些注意事項) – ingo 2011-04-10 18:36:12

+11

爲什麼一個'eval()'答案downvoted刪除,這一個upvoted? – BoltClock 2011-04-10 18:41:40

+1

@BoltClock:很好的問題。另外,我認爲我匆忙併誤解了這個問題,我不確定我的答案是否真的有助於OP。我添加了一個我認爲是@Switz想要的編輯,但我也同意這個問題的評論,可能有更合適的方法來完成這個 – goggin13 2011-04-10 18:43:18

13
var myString = "echoHello"; 

window[myString] = function() { 
    alert("Hello!"); 
} 

echoHello(); 

我不支持邪惡 EVAL。例如這裏:http://fiddle.jshell.net/Shaz/WmA8t/

+1

使這項工作在本地範圍內,我將刪除downvote。 – 2015-10-11 23:01:25

+0

@TomášZato'function aScope(){this [myString] = function(){alert(「Hello!」); };};' – rrw 2016-07-08 06:22:09

+0

@richmondwang'this'不是對本地作用域的引用,而是對函數在調用期間綁定的對象的引用。 – 2016-07-08 07:58:21

7

您可以訪問window對象作爲關聯數組,並設置它的方式

window["onlyVideo"] = "TEST"; 
document.write(onlyVideo); 
30

至於EVAL對全局變量的解決方案......

我想有每個人都有優勢,但這實際上是一種錯誤的二分法。 如果你是偏執性的全局命名空間,只需創建一個臨時命名空間&使用相同的技術。

var tempNamespace = {}; 
var myString = "myVarProperty"; 

tempNamespace[myString] = 5; 

敢肯定你會然後訪問作爲tempNamespace.myVarProperty(現爲5),使用窗口存儲避免。 (該字符串也可以直接放入括號中)

+0

有點重構你的代碼,使相同的內聯 var tempNamespace = {[「myVarProperty」]:「絕對唯一視頻」}; – Tioma 2017-02-15 12:50:22

+0

這是一個非常好的解決方案 - 看起來像eval()是要避免的,除非絕對必要,非常優雅的解決方法在這裏。 – skwidbreth 2017-02-27 17:58:14

6

窗口['variableName']方法只有在變量在全局範圍中定義時才起作用。正確的答案是「重構」。如果你可以提供一個「對象」上下文,那麼可能存在一個通用的解決方案,但是有一些變量,根據變量的範圍,沒有全局函數可以解決。

(function(){ 
    var findMe = 'no way'; 
})(); 
5

如果你試圖訪問一個對象的屬性,你必須先從window範圍並辦理對象的每個屬性,直到你得到你想要的。假設a.b.c已經在腳本中定義的其他地方,你可以使用以下命令:

var values = window; 
var str = 'a.b.c'.value.split('.'); 

for(var i=0; i < str.length; i++) 
    values = values[str[i]]; 

這將爲得到任何物體的屬性,無論它是多麼深工作。

+0

你的例子很酷。我注意到如果我使用'name'作爲變量名,你的例子失敗了,但是它可以和其他變量名一起工作。 這可能與已經具有'name'變量的Window對象有關。 此外,包括'.value'方法導致失敗。解釋深度嵌套對象變量的能力就是我正在尋找的東西,而且你的方法表明了一個好方向。謝謝。 – Theo 2016-07-31 19:23:15

+0

沒問題。答案更多的是展示這個概念,而不是一個複製/粘貼的答案(就像我認爲的大多數答案一樣) – 2016-08-02 07:27:15

+0

當你花時間改進它們而不是修復它們時,SO反應更好。 ;-) – Theo 2016-08-04 05:36:38

0

,它可以像這樣

(function(X, Y) { 
 
    
 
    // X is the local name of the 'class' 
 
    // Doo is default value if param X is empty 
 
    var X = (typeof X == 'string') ? X: 'Doo'; 
 
    var Y = (typeof Y == 'string') ? Y: 'doo'; 
 
    
 
    // this refers to the local X defined above 
 
    this[X] = function(doo) { 
 
    // object variable 
 
    this.doo = doo || 'doo it'; 
 
    } 
 
    // prototypal inheritance for methods 
 
    // defined by another 
 
    this[X].prototype[Y] = function() { 
 
    return this.doo || 'doo'; 
 
    }; 
 
    
 
    // make X global 
 
    window[X] = this[X]; 
 
}('Dooa', 'dooa')); // give the names here 
 

 
// test 
 
doo = new Dooa('abc'); 
 
doo2 = new Dooa('def'); 
 
console.log(doo.dooa()); 
 
console.log(doo2.dooa());

你在使用此爲
相關問題