Konvertieren Sie eine Zeichenfolge in einen Variablennamen in JavaScript


260

Ich habe nach Lösungen gesucht, aber keine gefunden.

Ich habe eine Variable namens onlyVideo.

"onlyVideo"Die Zeichenfolge wird an eine Funktion übergeben. Ich möchte die Variable onlyVideoinnerhalb der Funktion als etwas setzen. Wie kann ich das machen?

(Es gibt eine Reihe von Variablen, die in die Funktion aufgerufen werden könnten, daher muss sie dynamisch funktionieren, nicht fest codierte ifAnweisungen.)

Bearbeiten: Es gibt wahrscheinlich eine bessere Möglichkeit, das zu tun, was Sie versuchen. Das habe ich schon früh in meinem JavaScript-Abenteuer gefragt. Überprüfen Sie, wie JavaScript-Objekte funktionieren.

Ein einfaches Intro:

// 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;

5
Wofür benutzt du das? Sind Sie absolut sicher, dass Sie eine normale lokale Variable festlegen müssen und ein Objekt (Hash) nicht funktioniert?
Dogbert

mmm ... Ich verstehe immer noch nicht ganz, warum Sie dies in einer Welt mit Arrays tun wollen. Wie auch immer, ein Teil Ihres Codes und Ihrer Erklärung würde viel helfen.
Kevin Chavez

Ich denke, wir brauchen mehr Details darüber, was Ihr ultimatives Ziel ist
Mcgrailm

Antworten:


280

Wenn es sich um eine globale Variable handelt, dann window[variableName] oder in Ihrem Fallwindow["onlyVideo"] sollten Sie den Trick ausführen.


35
Auch wenn nicht global, können Sie es so , dass Zugriff durch scope[property]oder sogarthis[property]
Wojciech Bednarski

7
@WojciechBednarski: Verwechseln Sie Umfang und Kontext nicht. thisIst der Kontext, worauf er hinweist, hängt davon ab, wie die Funktion aufgerufen wird. In JS ist 50% der Zeit, thises windowsei denn, Sie aktivieren den strengen Modus und thiswird undefinedund wird einen Fehler auslösen. Der Bereich ist etwas völlig anderes und kein Objekt (außer dem globalen Bereich, der vom windowObjekt gespiegelt wird )
Slebetman

3
Funktioniert nicht in WebWorkers(wo selfauf den globalen Bereich verwiesen wird, genau wie im Browser, wo es gleich ist window) und Node.js, wo globalsich die gewünschte Variable befindet. Und es funktioniert neuer mit lokalen Bereichen, wie dem Funktionskörper.
Tomáš Zato - Wiedereinsetzung Monica

Gibt es überhaupt eine constMöglichkeit, diese Methode zu definieren ?
toing_toing

165

Javascript hat eine eval()Funktion für solche Gelegenheiten:

function (varString) {
  var myVar = eval(varString);
  // .....
}

Edit: Sorry, ich denke ich habe die Frage zu schnell überflogen. Dadurch erhalten Sie nur die Variable, die Sie zum Festlegen benötigen

function SetTo5(varString) {
  var newValue = 5;
  eval(varString + " = " + newValue);
}

oder wenn Sie eine Zeichenfolge verwenden:

function SetToString(varString) {
  var newValue = "string";
  eval(varString + " = " + "'" + newValue + "'");
}

Aber ich stelle mir vor, es gibt einen angemesseneren Weg, um das zu erreichen, wonach Sie suchen? Ich denke nicht, dass eval () etwas ist, das Sie wirklich verwenden möchten, es sei denn, es gibt einen guten Grund dafür. eval ()


3
Ja, ich würde lieber mit diesem Fenster arbeiten (es hat einige Einschränkungen)
ingo

12
Warum wurde eine eval()Antwort auf Löschung herabgestuft und diese aufgestimmt?
BoltClock

4
@goggin Sie sollten das Argument erneut testen, um sicherzustellen, dass es ein gültiger Name ist. Nur das Argument zu bewerten, ohne es vorher zu überprüfen, ist lächerlich unsicher.
Šime Vidas

16
Dies ist die einzig realistische Antwort auf die Frage. Nur weil es sich um das "eeeeevil" -Eval handelt, ist es nicht weniger wahr. Javascript hat keine variablen Variablen (wie $$ varname in PHP), daher ist dies wirklich die einzige Antwort. Die Verwendung window[varname]hat den Nebeneffekt, dass globale Variablen eingeführt werden, die möglicherweise nicht erwünscht sind. @Shaz Ich glaube nicht, dass Sie modernen JS-Dolmetschern genug Anerkennung schenken. Sie sind extrem schnell und das Parsen und Ausführen einer einfachen einzeiligen Zuweisungsoperation wird die CPU-Auslastung von niemandem erhöhen, solange dies nicht in einem 1-ms-Timer oder einer engen Schleife erfolgt.
MooGoo

2
@TheParamagneticCroissant Menschen, die sich leidenschaftlich für Code Care interessieren. Wer nur Zeit und Geld schätzt, tut das nicht.
Jimbo

41

Soweit eval vs. globale variable Lösungen ...

Ich denke, jeder hat Vorteile, aber das ist wirklich eine falsche Zweiteilung. Wenn Sie vom globalen Namespace paranoid sind, erstellen Sie einfach einen temporären Namespace und verwenden Sie dieselbe Technik.

var tempNamespace = {};
var myString = "myVarProperty";

tempNamespace[myString] = 5;

Ziemlich sicher, dass Sie dann als tempNamespace.myVarProperty (jetzt 5) darauf zugreifen können, ohne das Fenster für die Speicherung zu verwenden. (Die Zeichenfolge kann auch direkt in die Klammern gesetzt werden.)


Überarbeiten Sie Ihren Code ein wenig, um den gleichen Inline-Wert zu erzielen. Var tempNamespace = {["myVarProperty"]: "Definitiv nur Video"};
Tioma

1
Dies ist eine sehr gute Lösung - es scheint, dass eval () vermieden werden sollte, es sei denn, dies ist absolut notwendig, eine sehr elegante Problemumgehung.
Skwidbreth

Beginnend mit der Auflistung document.body.getElementsByTagName ('*') ist es einfach, alle Elemente mit einem 'id'-Attribut zu finden und eine Variable für den Elementobjektwert jedes einzelnen in einem globalen Objekt' id 'zu erstellen. Dann können Sie in JavaScript auf <div id = container> als 'id.container' verweisen. So einfach!
David Spector

15
var myString = "echoHello";

window[myString] = function() {
    alert("Hello!");
}

echoHello();

Sag nein zu der bösen Bewertung. Beispiel hier: https://jsfiddle.net/Shaz/WmA8t/


3
Machen Sie diese Arbeit auf lokaler Ebene und ich werde die Downvote entfernen.
Tomáš Zato - Wiedereinsetzung Monica

@ TomášZatofunction aScope() { this[myString] = function() { alert("Hello!"); };};
rrw

@richmondwang bezieht thissich nicht auf den lokalen Bereich, sondern auf das Objekt, an das die Funktion während des Aufrufs gebunden ist.
Tomáš Zato - Wiedereinsetzung Monica

8

Sie können als assoziatives Array auf das Fensterobjekt zugreifen und es auf diese Weise festlegen

window["onlyVideo"] = "TEST";
document.write(onlyVideo);

8

Die Fenstermethode ['variableName'] funktioniert NUR, wenn die Variable im globalen Bereich definiert ist. Die richtige Antwort lautet "Refactor". Wenn Sie einen "Objekt" -Kontext angeben können, gibt es eine mögliche allgemeine Lösung, aber es gibt einige Variablen, die keine globale Funktion basierend auf dem Umfang der Variablen auflösen könnte.

(function(){
    var findMe = 'no way';
})();

6

Wenn Sie versuchen, auf die Eigenschaft eines Objekts zuzugreifen, müssen Sie mit dem Bereich von beginnen windowund jede Eigenschaft des Objekts durchgehen, bis Sie zu der gewünschten Eigenschaft gelangen. Angenommen, dies a.b.cwurde an einer anderen Stelle im Skript definiert, können Sie Folgendes verwenden:

var values = window;
var str = 'a.b.c'.values.split('.');

for(var i=0; i < str.length; i++)
    values = values[str[i]];

Dies funktioniert, um die Eigenschaft eines Objekts zu erhalten, egal wie tief es ist.


Dein Beispiel ist cool. Ich stelle fest, dass nameIhr Beispiel fehlschlägt, wenn ich es als Variablennamen verwende, aber es funktioniert mit anderen Variablennamen. Dies hat möglicherweise damit zu tun, dass das Window-Objekt bereits eine nameVariable enthält. Auch das Einbeziehen der .valueMethode verursachte einen Fehler. Ich suche nach der Fähigkeit, tief verschachtelte Objektvariablen zu interpretieren, und Ihre Methode zeigt eine gute Richtung an. Vielen Dank.
Theo

Kein Problem. Die Antwort ist eher, um das Konzept zu demonstrieren, als eine Antwort zum Kopieren / Einfügen (wie die meisten Antworten hier auf SO, denke ich)

1
SO-Antworten sind sogar noch besser, wenn Sie die Zeit damit verbringen können, sie zu verbessern, anstatt sie zu reparieren. ;-)
Theo

Funktioniert nicht:Uncaught TypeError: Cannot read property 'split' of undefined
Roberto14


0

Das kann so gemacht werden

(function(X, Y) {
  
  // X is the local name of the 'class'
  // Doo is default value if param X is empty
  var X = (typeof X == 'string') ? X: 'Doo';
  var Y = (typeof Y == 'string') ? Y: 'doo';
  
  // this refers to the local X defined above
  this[X] = function(doo) {
    // object variable
    this.doo = doo || 'doo it';
  }
  // prototypal inheritance for methods
  // defined by another
  this[X].prototype[Y] = function() {
    return this.doo || 'doo';
  };
  
  // make X global
  window[X] = this[X];
}('Dooa', 'dooa')); // give the names here

// test
doo = new Dooa('abc');
doo2 = new Dooa('def');
console.log(doo.dooa());
console.log(doo2.dooa());


0

Der folgende Code erleichtert das Verweisen auf Ihre DIVs und andere HTML-Elemente in JavaScript. Dieser Code sollte direkt vor dem Tag eingefügt werden, damit alle HTML-Elemente angezeigt werden. Es sollte Ihr JavaScript-Code folgen.

// For each element with an id (example: 'MyDIV') in the body, create a variable
// for easy reference. An example is below.
var D=document;
var id={}; // All ID elements
var els=document.body.getElementsByTagName('*');
for (var i = 0; i < els.length; i++)
    {
    thisid = els[i].id;
    if (!thisid)
        continue;
    val=D.getElementById(thisid);
    id[thisid]=val;
    }

// Usage:
id.MyDIV.innerHTML="hello";
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.