Robert: Funktionsname aus Variablen zusammensetzen?

Hallo,

Kann man in JavaScript einen Funktionsnamen aus Variablen zusammensetzen?

Momentan probiere ich es gerade ziemlich erfolglos in dieser Richtung:

var loadMain_[arr[i]]=new Function();

arr ist dabei ein Array und i stammt aus einem Schleifendurchlauf.

  1. Kann man in JavaScript einen Funktionsnamen aus Variablen zusammensetzen?

    Kann man

    Momentan probiere ich es gerade ziemlich erfolglos in dieser Richtung:

    var loadMain_[arr[i]]=new Function();

    interessant wäre in welchem Kontext, also soll loadMain_...() global vorhanden sein, in einer Funktion oder in einem Objekt?

    Kann es sein, dass du einen Eventhandler eine Funktion zuweisen möchtest?

    Struppi.

  2. Hi,

    Kann man in JavaScript einen Funktionsnamen aus Variablen zusammensetzen?

    aber sicher. Wenn man bedenkt, dass jede globale Funktion eine Methode des window-Objekts ist, könnte man sogar selbst darauf kommen.

    function Halbsieben()  
     { alert("Halbsieben() wurde aufgerufen");  
     }  
      
    Halbsieben();  
    window.Halbsieben();  
    var s1="Halb";  
    var s2="sieben";  
    window[s1+s2]();
    

    Momentan probiere ich es gerade ziemlich erfolglos in dieser Richtung:
    var loadMain_[arr[i]]=new Function();

    Dieses Konstrukt erschließt sich mir nicht ganz ...

    So long,
     Martin

    --
    Wenn der Computer wirklich alles kann,
    dann kann er mich mal kreuzweise.
    1. Hallo Martin,

      windows1+s2;

      Das funktioniert einwandfrei. Tausend Dank. (Da wär ich nie drauf gekommen.)

      Momentan probiere ich es gerade ziemlich erfolglos in dieser Richtung:
      var loadMain_[arr[i]]=new Function();

      Dieses Konstrukt erschließt sich mir nicht ganz ...

      Ähm... *hust*... wie gesagt, das war nur Herumprobieren. Ich bin kein Experte in JavaScript.

      @Struppi:

      interessant wäre in welchem Kontext, also soll loadMain_...() global
      vorhanden sein, in einer Funktion oder in einem Objekt?

      Global.

      Kann es sein, dass du einen Eventhandler eine Funktion zuweisen möchtest?

      Nein.

    2. Hallo,

      windows1+s2;

      Noch ein Nachtrag dazu: Wie ich gerade herausgefunden habe, funktioniert das Ganze auch mit eval():

      eval(s1+s2)();

      1. [latex]Mae govannen![/latex]

        Noch ein Nachtrag dazu: Wie ich gerade herausgefunden habe, funktioniert das Ganze auch mit eval():

        eval(s1+s2)();

        Wer eval() für soewas nutzt, gehört an den Eiern aufgehängt, mit Stummeln brennender Zigaretten gequält und mindesten sechs mal täglich mit ner neunschwänzigen Katze ausgepeitscht.

        eval() ist eigentlich immer eine sehr schlechte Wahl. Im Forenarchiv wirst du dazu unzählige Diskussionen finden, muß nicht alles erneut durchgekaut werden. Exemplarisch: http://forum.de.selfhtml.org/archiv/2004/7/t85372/

        Cü,

        Kai

        --
        Die kleinen Mädchen aus der Vorstadt tragen heute Nasenringe aus Phosphor
        Die Lippen sind blau, die Haare grün, Streichholzetiketten am Ohr
        Aus den Jackentaschen ragen braune Flaschen so sieht man sie durch die Strassen ziehn
        überall wo sie vorübergehen hängt in der Luft ein Hauch von Benzin
        ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|]
        1. Hallo,

          eval() ist eigentlich immer eine sehr schlechte Wahl. Im Forenarchiv wirst du dazu unzählige Diskussionen finden, muß nicht alles erneut durchgekaut werden. Exemplarisch: http://forum.de.selfhtml.org/archiv/2004/7/t85372/

          Oha, ein sehr interessanter Thread. Ich wußte nicht, dass es es um eval() so schlecht bestellt ist. Scheint genauso im Verruf zu sein, wie der goto Befehl (aus C, sofern ich mich recht erinnere).

          Wenn mir jemand sagen kann, wie ich einen Array-Namen aus Variablen zusammensetzen kann, bin ich gerne dazu bereit das eval() auszutauschen.

          1. Hi,

            Wenn mir jemand sagen kann, wie ich einen Array-Namen aus Variablen zusammensetzen kann, bin ich gerne dazu bereit das eval() auszutauschen.

            Genauso, wie zuvor mit dem Funktionsnamen - auch das Array ist ein Unter-Objekt irgendeines anderen Objektes (von window, im Falle dass es eine globale Variable darstellt).

            Uebrigens, wann immer jemand die Notwendigkeit sieht, Variablennamen dynamisch zusammenzusetzen, ist davon auszugehen, dass er mit einem (weiteren) Array besser beraten waere.

            Statt drei Arrays namens array1, array2 und array3 zu verwenden, sollte man diese einfach ebenfalls in ein Array verpacken.

            MfG ChrisB

            1. Hallo,

              Wenn mir jemand sagen kann, wie ich einen Array-Namen aus Variablen zusammensetzen kann, bin ich gerne dazu bereit das eval() auszutauschen.

              Genauso, wie zuvor mit dem Funktionsnamen - auch das Array ist ein Unter-Objekt irgendeines anderen Objektes (von window, im Falle dass es eine globale Variable darstellt).

              Das klappt leider nicht:

              window['a'+i].length

              liefert den Hinweis: window["a"+i] has no properties.

              Uebrigens, wann immer jemand die Notwendigkeit sieht, Variablennamen dynamisch zusammenzusetzen, ist davon auszugehen, dass er mit einem (weiteren) Array besser beraten waere.

              Mmh... ist für mich aber einfacher zu warten/ändern. Array2[0] bezieht sich vom Inhalt her auf Array1[0], usw. Die grobe Funktion dazu:

              Arrays: a0 bis a3 und b0 bis b3

              ...  
              for(i=0;i<4;i++){  
                 for(j=0;j<a1.length;j++){  
                    if(eval('a'+i).length-(j+1)>=0){  
                       ...  
                       writeln(eval('b'+i)[j]);  
                       ...  
                       writeln(eval('a'+i)[j]);  
                       ...  
                       }  
                    }  
                 }  
              ...
              
              1. Das klappt leider nicht:

                window['a'+i].length

                liefert den Hinweis: window["a"+i] has no properties.

                Dann existiert im globalen Kontext keine Variabel a(i).

                Uebrigens, wann immer jemand die Notwendigkeit sieht, Variablennamen dynamisch zusammenzusetzen, ist davon auszugehen, dass er mit einem (weiteren) Array besser beraten waere.

                Mmh... ist für mich aber einfacher zu warten/ändern. Array2[0] bezieht sich vom Inhalt her auf Array1[0], usw. Die grobe Funktion dazu:

                Arrays: a0 bis a3 und b0 bis b3

                ...

                for(i=0;i<4;i++){
                   for(j=0;j<a1.length;j++){
                      if(eval('a'+i).length-(j+1)>=0){
                         ...
                         writeln(eval('b'+i)[j]);
                         ...
                         writeln(eval('a'+i)[j]);
                         ...
                         }
                      }
                   }
                ...

                  
                umständlicher geht es kaum, dass liesse sich schneller und leichter lesbar mit einem mehrdimensonalen Array erreichen, mir ist aber nicht ganz klar wie die Datenstruktur konkret aussieht.  
                  
                Struppi.
                
                1. Hallo,

                  Dann existiert im globalen Kontext keine Variabel a(i).

                  Uh... sorry, hab natürlich nicht beachtet, dass in diesem Fall die Arrays lokal sind. Wie würde ich denn das Array in disem Fall zusammensetzen?

                  Arrays: a0 bis a3 und b0 bis b3

                  [code lang=javascript]...
                  for(i=0;i<4;i++){
                     for(j=0;j<a1.length;j++){
                        if(eval('a'+i).length-(j+1)>=0){
                           ...
                           writeln(eval('b'+i)[j]);
                           ...
                           writeln(eval('a'+i)[j]);
                           ...
                           }
                        }
                     }
                  ...

                  umständlicher geht es kaum, dass liesse sich schneller und leichter lesbar mit einem mehrdimensonalen Array erreichen, mir ist aber nicht ganz klar wie die Datenstruktur konkret aussieht.

                  ??? Kannst du bitte mal erläutern, inwiefern die Verwendung von 8 Arrays umständlicher ist als ein mehrdimensionales Array? Und das mit dem schneller und leicheter lesbar verstehe ich überhaupt nicht. Ob ich nun ein mehrdimensionales Array oder mehrere Arrays verwende, der obige Code bleibt doch fast gleich.

                  1. Hallo,

                    Uh... sorry, hab natürlich nicht beachtet, dass in diesem Fall die Arrays lokal sind. Wie würde ich denn das Array in disem Fall zusammensetzen?

                    var arr = new Array;  
                    arr[1] = new Array;  
                    arr[1][0] = "wert";  
                      
                    // oder in der Literalschreibweise:  
                      
                    var arr [  
                       [  
                          "wert"  
                       ]  
                    ];  
                      
                    var i = 1;  
                    var j = 0;  
                    alert(arr[i][j]);
                    

                    Kannst du bitte mal erläutern, inwiefern die Verwendung von 8 Arrays umständlicher ist als ein mehrdimensionales Array?

                    Du hast eine ordentliche Datenstruktur und kannst auf eval verzichten.

                    Ob ich nun ein mehrdimensionales Array oder mehrere Arrays verwende, der obige Code bleibt doch fast gleich.

                    Du sparst dir unzählige unnötige und langsame eval-Aufrufe.

                    Mathias

                    1. var arr = new Array;

                      arr[1] = new Array;
                      arr[1][0] = "wert";

                      // oder in der Literalschreibweise:

                      var arr [
                         [
                            "wert"
                         ]
                      ];

                        
                      Ähm, das ist natürlich nicht äquivalent, außerdem fehlt da der Zuweisungsoperator. Die zweite Variante erzeugt arr[0] statt arr[1]. Allerdings besteht auch kein Grund, bei einem Array bei 1 anzufangen, also ist das ohnehin besser.  
                        
                      Mathias
                      
                      -- 
                      [SELFHTML aktuell Weblog](http://aktuell.de.selfhtml.org/weblog/)
                      
                  2. Dann existiert im globalen Kontext keine Variabel a(i).

                    Uh... sorry, hab natürlich nicht beachtet, dass in diesem Fall die Arrays lokal sind. Wie würde ich denn das Array in disem Fall zusammensetzen?

                    Gar nicht.

                    Arrays: a0 bis a3 und b0 bis b3

                    [code lang=javascript]...
                    for(i=0;i<4;i++){
                       for(j=0;j<a1.length;j++){
                          if(eval('a'+i).length-(j+1)>=0){
                             ...
                             writeln(eval('b'+i)[j]);
                             ...
                             writeln(eval('a'+i)[j]);
                             ...
                             }
                          }
                       }
                    ...

                    umständlicher geht es kaum, dass liesse sich schneller und leichter lesbar mit einem mehrdimensonalen Array erreichen, mir ist aber nicht ganz klar wie die Datenstruktur konkret aussieht.

                    ??? Kannst du bitte mal erläutern, inwiefern die Verwendung von 8 Arrays umständlicher ist als ein mehrdimensionales Array? Und das mit dem schneller und leicheter lesbar verstehe ich überhaupt nicht. Ob ich nun ein mehrdimensionales Array oder mehrere Arrays verwende, der obige Code bleibt doch fast gleich.

                    wie gesagt mir ist nicht klar was das obige soll, da ich deine Datenstruktur nicht kenne.

                    Aber schneller und lesbarer ist die Variante ohne eval immer, da eval immer langsam ist und dadurch das du Strings verknüpfen musst, wo eigentlich eine Datenstruktur steht, wird es auch unlesbarer.

                    Struppi.

                    1. Hallo,

                      Gar nicht.

                      Schade.

                      wie gesagt mir ist nicht klar was das obige soll, da ich deine Datenstruktur nicht kenne.

                      Damit werden die Arrays ausgelesen.

                      @molily:

                      Du hast eine ordentliche Datenstruktur und kannst auf eval verzichten.

                      Ahhh... *klick* ... natürlich. Ich glaub jetzt hab ich's begriffen. Ich werd mal versuchen, den Code dementsprechend abzuändern.

                      1. wie gesagt mir ist nicht klar was das obige soll, da ich deine Datenstruktur nicht kenne.

                        Damit werden die Arrays ausgelesen.

                        Das war mir klar, aber dein Konstrukt ist so verzwirbelt, das sich nicht erkennen läßt wie die Struktur der Daten ist.

                        Was soll diese Zeile z.b.:
                        for(j=0;j<a1.length;j++){

                        @molily:

                        Du hast eine ordentliche Datenstruktur und kannst auf eval verzichten.

                        Ahhh... *klick* ... natürlich. Ich glaub jetzt hab ich's begriffen. Ich werd mal versuchen, den Code dementsprechend abzuändern.

                        Naja, wenn du mal gezeigt hättest, wie die Daten Strukturiert sind, hätte ich dir ein konkretes Beispiel zeigen können.
                        So wie es aussieht möchtest du sowas:

                        var daten = [  
                         {  
                          a:['a1 1','a1 2','a1 3'], b:['b1 1','b1 2','b1 3']  
                         },  
                         {  
                          a:['a2 1','a2 2','a2 3'], b:['b2 1','b2 2','b2 3']  
                         },  
                        ];  
                        for(var i = 0; i < daten.length;i++) {  
                         var el = daten[i];  
                         for(var j = 0; j < el.a.length; j++) {  
                          document.write( el.a[j] + el.b[j] );  
                         }  
                         document.write( '<br>' );  
                        }  
                        
                        

                        Aber wir wissen es nicht.

                        Struppi.

                        1. Hallo,

                          Was soll diese Zeile z.b.:
                          for(j=0;j<a1.length;j++){

                          Zähle von Null bis eins weniger der Länge von Array a1.

                          Naja, wenn du mal gezeigt hättest, wie die Daten Strukturiert sind, hätte ich dir ein konkretes Beispiel zeigen können.

                          Ich verstehe nicht ganz, was du mit "wie die Daten Strukturiert sind" meinst. Der neue Code sieht jetzt jedenfalls wie folgt aus:

                          var a=new Array(4);var b=new Array(4);  
                          a[0]=("text1","text2",...);  
                          b[0]=("text1a","text2a",...);  
                          ...  
                          a[3]=("text1f","text2f",...);  
                          b[3]=("text1g","text2g",...);  
                            
                          ...  
                          for(i=0;i<4;i++){  
                             for(j=0;j<a[1].length;j++){  
                                if(a[i].length-(j+1)>=0){  
                                   ...  
                                   writeln(b[i][j]);  
                                   ...  
                                   writeln(a[i][j]);  
                                   ...  
                                   }  
                                }  
                             }  
                          ...
                          

                          Wie auch immer, das "evil" eval() wurde verbannt und der "neue" Code funktioniert einwandfrei. Danke an alle für die Antworten und die rege Teilnahme.

                          1. Was soll diese Zeile z.b.:
                            for(j=0;j<a1.length;j++){

                            Zähle von Null bis eins weniger der Länge von Array a1.

                            Ja auch klar, nur warum ausgerechnet a1, da muss man erst drauf kommen.

                            Naja, wenn du mal gezeigt hättest, wie die Daten Strukturiert sind, hätte ich dir ein konkretes Beispiel zeigen können.

                            Ich verstehe nicht ganz, was du mit "wie die Daten Strukturiert sind" meinst. Der neue Code sieht jetzt jedenfalls wie folgt aus:

                            [code lang=javascript]var a=new Array(4);var b=new Array(4);
                            a[0]=("text1","text2",...);
                            b[0]=("text1a","text2a",...);

                            Das ist Quatsch, damit weist du dem Arrayelement, das letzte Element in der Klammer zu.

                            ...
                            a[3]=("text1f","text2f",...);
                            b[3]=("text1g","text2g",...);

                            Mit dieser Schreibweise dürfte dein Code nicht funktionieren, der erwartet ein zweidimensonales Array, daher hatte ich dir auch ein Beispiel gezeigt, mit dem du sogar deine Bezeichnungen beibehalten könntest.

                            Wie auch immer, das "evil" eval() wurde verbannt und der "neue" Code funktioniert einwandfrei.

                            Das ist die Hauptsache, wobei ich mir nicht sicher bin ob du verstanden hast was du da machst.

                            Struppi.

                            1. Zähle von Null bis eins weniger der Länge von Array a1.

                              Ja auch klar, nur warum ausgerechnet a1, da muss man erst drauf kommen.

                              Weil a1 die meisten Elemente enthält. Das ist eine Sache die nur ich wissen kann. Das sie für das Problem aber nicht relevant war, habe ich diese Information nicht mit angegeben.

                              Das ist Quatsch, damit weist du dem Arrayelement, das letzte Element in der Klammer zu.

                              Hab ich auch gemerkt. Richtig muss es natürlich heißen:

                              a[0]=new Array("text1","text2",...);
                              b[0]=new Array("text1a","text2a",...);

                              Wie auch immer, das "evil" eval() wurde verbannt und der "neue" Code funktioniert einwandfrei.

                              ... wobei ich mir nicht sicher bin ob du verstanden hast was du da machst.

                              Ich bitte zu bedenken, dass ich den Code an einem anderen Rechner schreibe und es häufig vorkommt, dass ich mal den einen oder anderen Code-Fetzen vergesse abzutippen, wenn ich die Posts hier verfasse (im obigen Fall das "new Array").

          2. Wenn mir jemand sagen kann, wie ich einen Array-Namen aus Variablen zusammensetzen kann, bin ich gerne dazu bereit das eval() auszutauschen.

            In der Regel braucht man sowas nicht, wenn du das Gefühl hast eval() zu brauchen, dann ist dein Weg schon umständlich. Ob und wie du einen besseren/einfacheren/schnelleren Weg gehen kannst, hängt von der konkreten Sache ab, dazu müßte man aber mehr Wissen.
            Du kannst aber natürlich gerne den schlechteren Weg gehen

            Struppi.