Konvertera sträng till variabelnamn i JavaScript
Jag har letat efter lösningar, men kunde inte hitta någon som fungerar.
Jag har en variabel som kallas onlyVideo.
`"onlyVideo"` strängen skickas in i en funktion. Jag vill sätta variabeln `onlyVideo` inne i funktionen som något. Hur kan jag göra det?
(Det finns ett antal variabler som kan kallas in i funktionen, så jag behöver att det fungerar dynamiskt, inte hårdkodat med if-satser.)
Redigera: Det finns förmodligen ett bättre sätt att göra det du försöker göra. Jag frågade detta tidigt i mitt JavaScript-äventyr. Kolla hur JavaScript-objekt fungerar.
En enkel introduktion:
// 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;
Svar #1
Om det är en global variabel så borde window[variableName] eller i ditt fall window["onlyVideo"] göra susen.
Svar #2
Javascript har en eval()-funktion för sådana tillfällen:
function (varString) {
var myVar = eval(varString);
// .....
}
Redigera: Förlåt, jag tror att jag skummade igenom frågan för snabbt. Detta kommer bara att ge dig variabeln, för att ställa in den behöver du
function SetTo5(varString) {
var newValue = 5;
eval(varString + " = " + newValue);
}
eller om man använder en sträng:
function SetToString(varString) {
var newValue = "string";
eval(varString + " = " + "'" + newValue + "'");
}
Men jag föreställer mig att det finns ett mer lämpligt sätt att uppnå det du letar efter? Jag tror inte att eval() är något du verkligen vill använda om det inte finns en bra anledning för det. eval()
Svar #3
När det gäller eval- kontra globala variabellösningar...
Jag tycker att det finns fördelar med båda, men detta är verkligen en falsk dikotomi. Om du är paranoisk över det globala namnområdet, skapa bara ett temporärt namnområde och använd samma teknik.
var tempNamespace = {};
var myString = "myVarProperty";
tempNamespace[myString] = 5;
Ganska säker på att du då skulle kunna få åtkomst via tempNamespace.myVarProperty (nu 5), och undvika att använda window för lagring. (Strängen kan också sättas direkt i hakparenteserna)
Svar #4
var myString = "echoHello";
window[myString] = function() {
alert("Hello!");
}
echoHello();
Säg nej till den onda evalueringen. Exempel här: https://jsfiddle.net/Shaz/WmA8t/
Svar #5
Du kan göra så här
var name = "foo";
var value = "Hello foos";
eval("var "+name+" = '"+value+"';");
alert(foo);