In PHP können Sie erstaunliche / schreckliche Dinge wie diese tun:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
Gibt es eine Möglichkeit, so etwas mit Javascript zu machen?
var name = 'the name of the variable';
Kann ich beispielsweise einen Verweis auf die Variable mit dem Namen erhalten, wenn ich eine habe name
?
javascript
dynamic-variables
Finbarr
quelle
quelle
Antworten:
Da es bei ECMA- / Javascript um
Objects
undContexts
(die auch eine Art von Objekt sind) geht, wird jede Variable in einer so genannten Variablen- (oder im Fall einer Funktion, Aktivierungsobjekt ) gespeichert .Wenn Sie also Variablen wie diese erstellen:
Im globalen Bereich (= NO-Funktionskontext) schreiben Sie diese Variablen implizit in das globale Objekt (=
window
in einem Browser).Auf diese kann mit der Notation "Punkt" oder "Klammer" zugegriffen werden:
oder
Dies funktioniert nur für das globale Objekt in dieser bestimmten Instanz, da das variable Objekt des globalen Objekts das
window
Objekt selbst ist. Im Kontext einer Funktion haben Sie keinen direkten Zugriff auf das Aktivierungsobjekt . Zum Beispiel:new
Erstellt eine neue Instanz eines selbst definierten Objekts (Kontext). Ohnenew
den Umfang der Funktion wäre auchglobal
(= Fenster). Dieses Beispiel würde alarmierenundefined
und1
jeweils. Wenn wir ersetzen würden durchthis.a = 1; this.b = 2
:Beide Alarmausgaben wären undefiniert. In diesem Szenario werden die Variablen
a
undb
im Aktivierungsobjekt gespeichertfoobar
, von dem aus wir nicht darauf zugreifen können (natürlich können wir direkt auf diese zugreifen, indem wira
und aufrufenb
).quelle
eval
ist eine Option.quelle
Sie können das Fensterobjekt verwenden, um darauf zuzugreifen.
window
hat einen Verweis auf alle globalen Variablen und globalen Funktionen, die Sie verwenden.quelle
Weiß nur nicht, was für eine schlechte Antwort so viele Stimmen bekommt. Es ist eine recht einfache Antwort, aber Sie machen es komplex.
quelle
this
" - Wenn Sie auf diese Weise auf eine globale Variable zugreifen möchten , ist es besser, explizit zu sein und daswindow
Objekt nicht zu verwendenthis
.this
ist nicht eindeutig.this
oder nichts anderes verwenden, umtype
von Ihrem Beispiel aus auf die Variable zuzugreifen , wenn Sie ihren Namen in einer anderen Variablen haben:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')
wird angezeigtarticle
, nichtsomething else
. Und das erklärt die "komplexe Antwort".Versuche dies...
quelle
Dies ist ein Beispiel :
Ein anderes Beispiel :
Der Wert " coco " von myVariable wird also zu einem variablen coco .
Weil alle Variablen im globalen Bereich Eigenschaften des Window-Objekts sind.
quelle
In Javascript können Sie die Tatsache verwenden, dass alle Eigenschaften Schlüsselwertpaare sind. jAndy hat dies bereits erwähnt, aber ich glaube nicht, dass seine Antwort zeigt, wie es ausgenutzt werden kann.
Normalerweise versuchen Sie nicht, eine Variable zu erstellen, die einen Variablennamen enthält, sondern versuchen, Variablennamen zu generieren und diese dann zu verwenden. PHP macht es mit
$$var
Notation, aber Javascript muss nicht, weil Eigenschaftsschlüssel mit Array-Schlüsseln austauschbar sind.ergibt 123. Normalerweise möchten Sie die Variable konstruieren, weshalb es die Indirektion gibt, damit Sie es auch umgekehrt machen können.
quelle
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 istwith()
)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:
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ültigquelle
Wenn Sie kein globales Objekt wie window oder global (node) verwenden möchten, können Sie Folgendes versuchen:
quelle
Ich musste mehrere FormData im laufenden Betrieb zeichnen und die Objektweise funktionierten gut
Dann in meinen Schleifen, wo immer ich Formulardaten erstellen musste, die ich verwendet habe
quelle
Dies ist eine Alternative für diejenigen, die eine dynamisch benannte Variable exportieren müssen
Eine andere Alternative besteht darin, einfach ein Objekt zu erstellen, dessen Schlüssel dynamisch benannt werden
quelle
was sie bedeuten ist nein, du kannst nicht. Es gibt keine Möglichkeit, dies zu erreichen. so war es möglich, dass Sie so etwas tun konnten
eine Erstellungsfunktion haben, wie sie in ECMAScript 5 implementiert ist.
quelle
eval
Operatoreval () hat in meinen Tests nicht funktioniert. Das Hinzufügen von neuem JavaScript-Code zum DOM-Baum ist jedoch möglich. Hier ist also eine Funktion, die eine neue Variable hinzufügt:
quelle
var node_head = document.getElementsByTagName("head")[0]
anstelle von ID zu verwenden, da niemand ein gibtid="head"
zu<head>
:-)Obwohl dies eine akzeptierte Antwort hat, möchte ich eine Bemerkung hinzufügen:
In ES6
let
funktioniert die Verwendung nicht :Jedoch mit
var
ArbeitenIch hoffe, dass dies für einige nützlich sein kann.
quelle
const
const vars = { t, m, b }; console.log(vars['b'])
. Ansonsteneval
funktioniert es auch.use Object ist auch großartig.
quelle