Peter Später: Variable in Funktion definieren und außerhalb sichtbar machen

Also gut, hab jetzt google eine zeitlang mit Suchanfragen à la "javascript create global variable in function" bemüht - spuckt so ziemlich alles aus, von Erklärungen über Definitionen, Scope, Hoisting, etc. - nur nicht wonach ich suche 👀

...und zwar würde ich gern über eine Funktion eine Variable kreiern, deren Name ich der Funktion bei Aufruf übergebe, so in die Richtung:

function varName(var_Name) {
	var var_Name = "Wert";
}
varName(Variable);
console.log(Variable); // ReferenceError: Variable is not defined

...leider bekomme ich dafür nur einen Reference-Error, weil "Variable" nicht übernommen wird, da ja nur im Scope der Funktion vorhanden.

Wie lässt sich dieses mein Vorhaben umsetzen?

Danke! P.

akzeptierte Antworten

  1. Tach!

    ...und zwar würde ich gern über eine Funktion eine Variable kreiern, deren Name ich der Funktion bei Aufruf übergebe, so in die Richtung:

    Das liest sich nicht wie ein erstrebenswertes Vorgehen, aber in Ermanglung des Wissens, was du eigentlich zu lösen versuchst, hier eine Antwort dazu.

    function varName(var_Name) {
    	var var_Name = "Wert";
    }
    varName(Variable);
    console.log(Variable); // ReferenceError: Variable is not defined
    

    Der Fehler ist berechtigt, denn du möchtest der Funktion varName() einen Namen und nicht die Variable selbst übergeben. Der Name ist in dem Fall ein String und der muss in Anführungszeichen notiert werden.

    Doch der String allein reicht nicht, um die Variablen dementsprechend anlegen zu können. Dazu muss man noch wissen, dass globale Variablen Eigenschaften des window-Objekts sind. Und wie man Eigenschaften ansprechen kann, wenn man deren Namen als String vorliegen hat, nämlich so:

    var name = 'foo'; // hier explizit angelegt, du bekommst aber den Namen als Parameter übergeben
    ein_objekt[name] = 42;
    

    Das entspricht

    ein_objekt.foo = 42;
    

    Das geht in der Form auch mit dem window-Objekt. Also, zusammengebaut sieht das so aus:

    function varName(var_Name) {
    	window[var_Name] = "Wert";
    }
    varName('Variable');
    console.log(Variable);
    

    Wenn du möchtest, kannst du ja mal schreiben, was du eigentlich lösen möchtest, vielleicht findet sich ja eine bessere Vorgehensweise.

    dedlfix.

    1. Hallo,

      mein Ansatz ist auch für mich eher unbefriedigend.

      Im Endeffekt geht es um das Vorhaben, Objekte mit einer Funktion zu bearbeiten und das Ergebnis dann in einer Variable zur weiteren Bearbeitung zu speichern - diese Variablen werden aber nur dann benötigt, wenn die Funktion auf dem Objekt auch ausgeführt wurde und müssen daher NUR DANN definiert werden, wenn sie auch benötigt werden.

      Bsp.:

      // Pseudocode
      
      var Obj1;
      var Obj2;
      var Obj3;
      
      function eineFunktion(Objekt, ichbinResultat) {
       var ichbinResultat = Objekt.reduce( // (...) weitere Bearbeitung
      }
      
      eineFunktion(Obj1, Resultat1);
      eineFunktion(Obj3, Resultat3);
      
      /*
      Es gibt nun die Variablen
      Obj1, Obj2, Obj3, Resultat1, Resultat3
      
      
      Natürlich könnten die Resultat-Variablen auch im Window-Scope definiert werden, dann müsste aber auch eine Variable "Resultat2" definiert werden, die hier gar nicht benötigt wird.
      */
      
      
      

      Danke an dedlfix für seinen Input und allen für weiteres Feedback dazu 😀

      P.

      1. Im Endeffekt geht es um das Vorhaben, Objekte mit einer Funktion zu bearbeiten und das Ergebnis dann in einer Variable zur weiteren Bearbeitung zu speichern - diese Variablen werden aber nur dann benötigt, wenn die Funktion auf dem Objekt auch ausgeführt wurde und müssen daher NUR DANN definiert werden, wenn sie auch benötigt werden.

        Du bescheibst Zustände eines Objekts. Wozu also weitere Variablen? Reiche doch einfach das Objekt zur weiteren Verarbeitung durch.

        MfG

  2. Lieber Peter,

    ...und zwar würde ich gern über eine Funktion eine Variable kreiern, deren Name ich der Funktion bei Aufruf übergebe,

    Deine Worte klingen für mich so, als wolltest Du etwas unsinniges erreichen, weil Du meinst, dass das der richtige Lösungsweg für Dein eigentliches Problem sei. Daher meine Gegenfrage:

    Was ist Dein eigentliches Problem?

    Weiter unten schreibst Du:

    Im Endeffekt geht es um das Vorhaben, Objekte mit einer Funktion zu bearbeiten und das Ergebnis dann in einer Variable zur weiteren Bearbeitung zu speichern - diese Variablen werden aber nur dann benötigt, wenn die Funktion auf dem Objekt auch ausgeführt wurde und müssen daher NUR DANN definiert werden, wenn sie auch benötigt werden.

    Das klingt schon eher nach "eigentliches Problem". Trotzdem glaube ich noch nicht, dass Du dort das eigentliche Problem beschrieben hast, sondern nur Deinen momentanen Lösungsansatz. Daher noch einmal:

    Was ist Dein eigentliches Problem?

    Liebe Grüße,

    Felix Riesterer.

    1. Hallo, danke für eure Antworten!

      Mein eigentliches Problem:

      Gegeben sind Objekte, die alle verschiedene Eigenschaften besitzen. Wird nun z.B. Wert_A von Objekt_X mit Wert_B von Objekt_Y multipliziert, so würde ich das Ergebnis gern in einer eigens dafür kreierten Variable speichern, sozusagen var "Objekt_X_Wert_A-multipliziert-mit-Objekt_Y_Wert_B" (natürlich nicht die tatsächliche Variablennamen - hier nur zum besseren Verständnis so ausgeführt).

      (Multipliziere ich nun weiters z.B. Wert_A von Objekt_X mit Wert_C von Objekt_Z, so bräuchte ich hierfür die Variable "Objekt_X_Wert_A-multipliziert-mit-Objekt_Z_Wert_C" usw.)

      Alle Resultate müssen frei untereinander sowie mit den Ausgangswerten kombinierbar sein, z.B.

      "Objekt_X_Wert_A-multipliziert-mit-Objekt_Z_Wert_C" + Objekt_X_Wert_A

      etc. und danach als Variable "fassbar" sein.

      1. Hallo Peter,

        warum nimmst du nicht die Rückgabe der Funktion?

        function mult(a,b) {
          return a*b;
        }
        
        var x = mult(2,3);
        var y = mult(x,4);
        var z = mult(x,y);
        x = mult(x,3); // Ich glaube, das meinte pl mit „durchreichen“
        

        Gruß
        Jürgen

        PS Was dein eigentliches Problem ist, habe ich noch nicht verstanden.

        1. Hallo,

          danke nochmals für eure Hilfe, ihr habt mich auf die richtige Spur gebracht, und damit zur Lösung des Problems beigetragen! 😀

          Hintergrund des Problems:

          Ich hatte eine Funktion mit einer ziemlich verschachtelten Datenstruktur, die mir einfach keine Resultate lieferte (siehe oben erwähnten ReferenceError - daher auch die vielleicht ein wenig abenteuerliche Idee, mit der Kreation globaler Variablen Resultate zu "forcieren").

          ...im Endeffekt half nur Tabula Rasa und die komplette Neukonstruktion der erwähnten Funktion - und siehe da, es fehlte tatsächlich die Rückgabe einer Subfunktion!

          Schönen Abend euch allen! P.

      2. Hallo Peter,

        verwende ein Objekt zur Ablage der Ergebnisse. Das ist auf jeden Fall besser, als das window-Objekt mit Variablen zuzumüllen. Wenn die Rechnungen von außen angestoßen werden, ist es auch sinnvoll, das Speichern der Ergebnisse von außerhalb zu steuern. Im einfachsten Fall speicherst Du die Ergebnisse als Properties des Objekts.

        var ergebnisse = { };
        var objX = /* irgendwas */, objY = /* nochwas */, objZ = /* dingsbums */;
        
        ergebnisse["dies_X"] = rechneDies(objX);
        ergebnisse["X_mit_Y"] = rechneDas(objX, objY);
        

        Die Frage ist natürlich: Was machst Du mit deinen gespeicherten Ergebnissen? Da steckt ja ein Sinn dahinter, und es ist dann natürlich die Frage, was Du mit den Berechnungen vorhast. Ist es sinnvoll, einen String als Schlüssel zu verwenden? Musst Du auch wieder rückwärts von den Ergebnissen auf die beteiligten Objekte schließen können? Musst Du die Ergebnisse in einer bestimmten Ordnung auflisten können?

        Davon hängt ab, welche Datenstruktur sinnvoll ist, um die Ergebnisse zu speichern. Ein flaches Dictionary, wie gerade gezeigt, ist eine sehr primitive Lösung und - je nach beabsichtigtem Nutzen - deutlich verbesserbar.

        Im Sinne von "Separation of Concerns" ist es auch nicht sinnvoll, dass die Berechnungsmethoden ihre Ergebnisse selbst speichern. Ein externes Management der Ergebnisse dürfte die Handhabung deutlich vereinfachen. Was man genau tun kann, das lässt sich ohne Kenntnis der Aufgabenstellung schlecht sagen.

        Rolf

        --
        sumpsi - posui - clusi