2019
TL; DR
eval Der Operator kann den Zeichenfolgenausdruck in dem aufgerufenen Kontext ausführen und Variablen aus diesem Kontext zurückgeben.
literal objecttheoretisch kann man das durch schreiben machen: {[varName]}aber es ist per definitionem blockiert.
Ich stoße also auf diese Frage und alle hier spielen einfach herum, ohne eine echte Lösung zu finden. aber @Axel Heider hat eine gute Annäherung.
Die Lösung ist eval. fast am meisten vergessener Betreiber. (denke, das meiste ist with())
evalDer Operator kann den Ausdruck in dem von ihm aufgerufenen Kontext dynamisch ausführen. und geben Sie das Ergebnis dieses Ausdrucks zurück. Damit können wir den Wert einer Variablen im Funktionskontext dynamisch zurückgeben.
Beispiel:
function exmaple1(){
var a = 1, b = 2, default = 3;
var name = 'a';
return eval(name)
}
example1() // return 1
function example2(option){
var a = 1, b = 2, defaultValue = 3;
switch(option){
case 'a': name = 'a'; break;
case 'b': name = 'b'; break;
default: name = 'defaultValue';
}
return eval (name);
}
example2('a') // return 1
example2('b') // return 2
example2() // return 3
Beachten Sie, dass ich immer explizit schreibe, dass der Ausdruck ausgeführt evalwird. Um unnötige Überraschungen im Code zu vermeiden. evalist sehr stark
Aber ich bin sicher, dass Sie das schon wissen
Übrigens, wenn es legal wäre, könnten wir literal objectden Variablennamen und den Wert erfassen, aber wir können berechnete Eigenschaftsnamen und Eigenschaftswerte nicht kombinieren. Die Kurzschrift ist leider ungültig
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`