Ruft die globale Variable dynamisch anhand der Namenszeichenfolge in JavaScript ab

77
<script>
//in one script
var someVarName_10 = 20;
</script>

Ich möchte von einem anderen Skript über den Namen der Variablen auf diese Variable zugreifen können. Mit Fensterobjekt ist es einfach, ist es mit lokaler Variable möglich?

Ich meine, greifen Sie mit folgendem Code auf diese Variable zu:

<script>
  alert(all_vars['someVar' + 'Name' + num]);
</script>
Appqui-Plattform
quelle
1
Ihr Beispiel zeigt eine globale Variable. Sie möchten wissen, ob Sie von einem lokalen Bereich aus darauf zugreifen können?
Crescent Fresh
Es hängt wirklich davon ab, was Sie unter "lokalem Bereich" verstehen. Javascript-Funktionen beschränken sich nur auf Funktionen, nicht auf Blöcke oder sogar Dateien
K Prime

Antworten:

112

Möchtest du so etwas machen?

<script>
//in one script
var someVarName_10 = 20;

alert(window["someVarName_10"]); //alert 20

</script>

Update : weil OP die Frage bearbeitet hat.

<script>
  num=10;
  alert(window['someVar' + 'Name_' + num]); //alert 20
</script>
SIE
quelle
Entschuldigung, ich habe mich geirrt, ich dachte, dass Vars nicht im Fenster sind, danke
Appqui-Plattform
8
Es ist mir egal, was OP eigentlich wollte. Ich kümmere mich um den fraglichen Titel und werde daher bei meinen Suchanfragen zum Google-Ergebnis.
Tomáš Zato - Wiedereinsetzung Monica
Was ist, wenn die Variable ein Objekt ist und ich ein inneres Objekt möchte ? zum Beispiel var a = {name: "ABC"}. Hier window["a.name"]wird nicht funktionieren. Problemumgehungen?
Deepak Chaudhary
1
@DeepakChaudhary, möchten Sie vielleicht so etwas wie lodashs _.get? - lodash.com/docs#get
SIE
2
Das wäre Fenster ["a"]. Name;
Repo
44

Ich habe festgestellt, dass jeder die Erstellung globaler Variablen empfiehlt. Dies führt dazu, dass Variablen in den globalen Namespace gelangen. Wenn Sie dynamisch Klassennamen oder nur Variablen erstellen, ist es einfach, sie lokal zu halten:

this['className'] = 123;

oder

this['varName'] = 123;

Der Namensabstand würde folgendermaßen aussehen:

vars = {};
vars['varName'] = 123;
vars.varName // 123
Andrew Shatnyy
quelle
1
var this['className'] = 123;sieht für mich wie ein Syntaxfehler aus.
Felix Kling
1
Dies ist besser als akzeptierte Antwort. Beschreibender, wie diese Funktion in Klassenbereichen funktioniert.
Sellorio
12
<script>
    var someVarName_10 = 20;
    var num = 10;
    alert(eval('someVar' + 'Name_' + num)); //alert 20
</script>
Matteo Baroni
quelle
evalhat besser für mich funktioniert! aber verwenden Sie es mit Vorsicht
Papaiatis
1

Nun, nur zum Debuggen könnten Sie so etwas tun. Ich benutze es während der Entwicklung von Klassen, bei denen einige Variablen privat bleiben müssen (var). Dies funktioniert auch in lokalen Variablen (und global von Fluch)

function MYCLASS(){
    var a=1, b=2, c=3;
    this.public = "variable";
    this.debug = function(sVar){
        return eval(sVar);
    }
}

var myThing = new MYCLASS();
myThing.debug('a') //return 1
myThing.debug('b') //return 2
myThing.debug('c') //return 3
Nereo Costacurta
quelle
0

Dies ist nicht meine eigene Antwort, die Antwort von Arthur Araújo , aber ich denke, dass sie hier relevant ist.


Eval Alternative:

exp = '1 + 1'
x = Function('return ' + exp)()
console.log(x)
Elron
quelle
-7

Wenn Sie das gesagt haben:

<script type="text/javascript">
var hello = 'test';
</script>
<script type="text/javascript">
  alert (hello);
</script>

Es funktioniert, weil das Skript endlich für das Dokument verfügbar ist und Sie auf deren Variablen zugreifen können.

Sarfraz
quelle