2019
TL; DR
eval
Der Operator kann den Zeichenfolgenausdruck in dem aufgerufenen Kontext ausführen und Variablen aus diesem Kontext zurückgeben.
literal object
theoretisch 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()
)
eval
Der 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 eval
wird. Um unnötige Überraschungen im Code zu vermeiden. eval
ist sehr stark
Aber ich bin sicher, dass Sie das schon wissen
Übrigens, wenn es legal wäre, könnten wir literal object
den 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 }`