Robert: Lokale Variablen in andere Funktion auslagern?

Hallo,

ich habe z.B. folgende Funktion:

function test()
{
var a = 1;
var b = 2;
var c = 3;
tue_dies()
tue_das()
}

Die drei Variablen würde ich gerne in eine separate Funktion auslagern (sie sollen nicht global abgelegt werden), da sie noch von anderen Funktionen genutzt werden sollen.

Mir schwebt folgendes vor:

function test()
{
test2()
tue_dies()
tue_das()
}

function test2()
{
var a = 1;
var b = 2;
var c = 3;
}

Allerdings geht das so nicht, da nur "test2" die Variablen kennt. Ich müsste Sie also an "test" übergeben. Wie mache ich das?

  1. Hi,

    Die drei Variablen würde ich gerne in eine separate Funktion auslagern (sie sollen nicht global abgelegt werden), da sie noch von anderen Funktionen genutzt werden sollen.

    Dann erzeuge ein Objekt, dass diese Variablen als Eigenschaften, und die Funktionen als Methoden besitzt.

    MfG ChrisB

    1. Dann erzeuge ein Objekt, dass diese Variablen als Eigenschaften, und die Funktionen als Methoden besitzt.

      Ähm... ich nix verstehen ;-). Kannst du mir dafür mal ein Beispiel geben?

      1. Hallo,

        Dann erzeuge ein Objekt, dass diese Variablen als Eigenschaften, und die Funktionen als Methoden besitzt.

        Ähm... ich nix verstehen ;-).

        Guckst du hier :-).

        Kannst du mir dafür mal ein Beispiel geben?

        Klar doch:

          
          
        //statt deiner function test2() ein Objekt anlegen:  
        test2 =  
        {  
          Eigenschaft_a: 1,  
          Eigenschaft_b: 2,  
          Eigenschaft_c: 3,  
          Methode_1: function () {return "Ich bin das Ergebnis von Methode_1.";},  
          Methode_2: function () {return "Ich bin das Ergebnis von Methode_2.";}  
        }  
          
        //In deiner function test() auf Eigenschaften und Methoden von test2 zugreifen:  
        function test()  
        {  
          alert( test2.Eigenschaft_a ); // 1  
          alert( test2.Methode_1() );   // Ich bin das Ergebnis von Methode_1.  
          
          tue_dies();  
          tue_das();  
        }
        

        Hier sind ist nur meinObjekt und test global, du verstehen?

        Gruß, Don P

        1. Kannst du mir dafür mal ein Beispiel geben?

          Klar doch:

          Vielen Dank. Ist aber auch nicht so das Gelbe vom Ei. Für mich sieht der Code jetzt wie folgt aus:

            
          v = {  
          a:1,b:2,c:3  
          }  
            
          function test(){  
          var a = v.a;  
          var b = v.b;  
          var c = v.c;  
          tue_dies;  
          tue_das;  
          }  
          
          

          Ich muss also im Endeffekt wieder drei Variablen definieren, damit die eigentlichen Variablen lokal vorhanden sind. Das ist natürlich ziemlich schwachsinnig. Ich werde die Variablen dann doch global definieren.

          Mal noch eine offtopic Frage zu folgendem Code:

            
          var x = "test";  
          writeln(x+x+x+x+x+x+x+x+x+x+x+x);  
          
          

          Kann ich das Verbinden der Strings kürzer schreiben? Z.B. writeln(11*x) oder so. Alternativ ginge zwar auch for(var i=1;i<=11;i++}writeln(x); , aber Schleifen sollen hier mal außen vor gelassen werden.

          1. Hallo,

            Vielen Dank. Ist aber auch nicht so das Gelbe vom Ei. Für mich sieht der Code jetzt wie folgt aus:

            v = {
            a:1,b:2,c:3
            }

            function test(){
            var a = v.a;
            var b = v.b;
            var c = v.c;
            tue_dies;
            tue_das;
            }

            
            > Ich muss also im Endeffekt wieder drei Variablen definieren [...]  
              
            Naja, du willst keine globalen Variablen, aber sie dennoch von überall ansprechen, als seien sie global. Das widerspricht sich irgendwie. Es gibt aber meines Wissens schon Möglichkeiten, so etwas zu realisieren, schau dich mal [hier um](http://forum.de.selfhtml.org/archiv/2007/10/t160810/#m1046102). Deinen Fragen nach zu urteilen, dürftest du aber noch zu wenig JavaScript-Kenntnisse haben, um das einfach für deine Zwecke umzusetzen. Im Prinzip läuft es darauf hinaus, den ganzen eigenen Code in einem vom globalen Objekt separaten Scope laufen zu lassen.  
              
            
            > Mal noch eine offtopic Frage zu folgendem Code:  
            >   
            > ~~~javascript
              
            
            > var x = "test";  
            > writeln(x+x+x+x+x+x+x+x+x+x+x+x);  
            > 
            
            

            Kann ich das Verbinden der Strings kürzer schreiben? Z.B. writeln(11*x) oder so. Alternativ ginge zwar auch for(var i=1;i<=11;i++}writeln(x); , aber Schleifen sollen hier mal außen vor gelassen werden.

            Mach dich doch mal kundig, was das String-Objekt alles kann. Das von dir gewünschte Feature ist aber nicht dabei, soviel kann ich dir schon verraten. Ansonsten gilt hier aber das Motto *SELF*HTML.

            Gruß, Don P

            1. Naja, du willst keine globalen Variablen, aber sie dennoch von überall ansprechen, als seien sie global.

              Moooooment... globale Variablen werden immer in den Speicher geladen, lokale nur wenn sie gebraucht werden. Aus diesem Grund wollte ich lokale Variablen von überall her ansprechen können.

              Das von dir gewünschte Feature ist aber nicht dabei, soviel kann ich dir schon verraten.

              Das ist bekannt. Deswegen habe ich ja hier nachgefragt. Eventuell gibt es ja die Möglichkeit mit Klammern solche Verkettungen zu verkürzen.

              Was passiert eigentlich mit der Variable bei for(var i=1;...;...)? Wird die Variable nach dem Durchlaufen der Schleife gelöscht oder bleibt sie innerhalb der Funktion bestehen?

              1. Hallo,

                Moooooment... globale Variablen werden immer in den Speicher geladen, lokale nur wenn sie gebraucht werden. Aus diesem Grund wollte ich lokale Variablen von überall her ansprechen können.

                Häh?
                Ich glaube um sowas solltest du dir bei JavaScript einfach keine Gedanken machen.
                Du widersprichst dir.
                Wenn lokale Variablen »von überall her ansprechbar« sein sollen, dann sind sie auch »immer im Speicher geladen«.

                Was passiert eigentlich mit der Variable bei for(var i=1;...;...)? Wird die Variable nach dem Durchlaufen der Schleife gelöscht oder bleibt sie innerhalb der Funktion bestehen?

                Die Anweisung var i = 1; legt auch dort eine lokale Variable im aktuellen (Funktions-)Scope an, Schleifen erzeugen keine Scopes.

                Mathias

              2. Moin Moin!

                Naja, du willst keine globalen Variablen, aber sie dennoch von überall ansprechen, als seien sie global.

                Moooooment... globale Variablen werden immer in den Speicher geladen, lokale nur wenn sie gebraucht werden.

                Falsch. Keine Variable wird in den Speicher geladen, sie *belegt* Speicher. Globale Variablen belegen den Speicher wärend der gesamten Programmlaufzeit (bei Javascript: so lange die Seite geladen ist), lokale Variablen werden beim Funktionsaufruf dynamisch erzeugt und in aller Regel am Funktionsende wieder freigegeben. Alle dort gespeicherten Variablen sind weg. Ausnahmen bestätigen die Regel, wenn die Variable noch in einem anderen Scope benutzt wird (z.B. bei Closures).

                Aus diesem Grund wollte ich lokale Variablen von überall her ansprechen können.

                Und dann würden sie immer benötigt werden und folglich immer Speicher belegen. Das hast Du nicht bis zu Ende gedacht.

                Das von dir gewünschte Feature ist aber nicht dabei, soviel kann ich dir schon verraten.

                Das ist bekannt. Deswegen habe ich ja hier nachgefragt. Eventuell gibt es ja die Möglichkeit mit Klammern solche Verkettungen zu verkürzen.

                Nicht in Javascript. Perl kann sowas, auch mit Arrays:

                  
                $barts_tafel="I will not waste chalk\n" x 100; # ein  String mit 100 Wiederholungen  
                @barts_tafel=("I will not waste chalk\n") x 100; # ein Array mit 100 identischen Strings.  
                
                

                Was passiert eigentlich mit der Variable bei for(var i=1;...;...)? Wird die Variable nach dem Durchlaufen der Schleife gelöscht oder bleibt sie innerhalb der Funktion bestehen?

                In Javascript existiert sie weiter. Variablen sind ab "var" in der gesamten Funktion sichtbar, auch wenn das "var" irgendwo in einem Block steht. Auch da ist Perls "my" eleganter.

                Alexander

                --
                Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          2. Hallo,

            Für mich sieht der Code jetzt wie folgt aus:

            v = {
            a:1,b:2,c:3
            }

            function test(){
            var a = v.a;
            var b = v.b;
            var c = v.c;
            tue_dies;
            tue_das;
            }

            
            > Ich muss also im Endeffekt wieder drei Variablen definieren  
              
            1\. Was hast du eigentlich vor? Mit sinnlosem Beispielcode kann dir niemand etwas über die Sinnhaftigkeit deiner Programmstruktur sagen.  
              
            2\. Warum musst du das? Es ist der Sinn von solchen globalen Objekten zur Ordnung der Daten, dass du immer direkt auf sie zugreifst, ohne nochmal Kopien in einzelnen Funktionen anzulegen.  
              
            
            > damit die eigentlichen Variablen lokal vorhanden sind.  
              
            Häh? Immer wenn du darauf zugreifen willst, nimmst du v.a usw.  
              
            
            > Das ist natürlich ziemlich schwachsinnig. Ich werde die Variablen dann doch global definieren.  
              
            Tust du ja, du gruppierst sie an einem globalen Objekt.  
              
            Allgemein solltest du deine gesamten Scripte in Object-Strukturen sortieren, das ist so ziemlich die einzige Möglichkeit (außer echtem OOP), die einem JavaScript bietet.  
              
            <http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#object>  
              
            Mathias
            
            -- 
            [SELFHTML aktuell Weblog](http://aktuell.de.selfhtml.org/weblog/)
            
          3. Moin Moin!

            Vielen Dank. Ist aber auch nicht so das Gelbe vom Ei. Für mich sieht der Code jetzt wie folgt aus:

            v = {
            a:1,b:2,c:3
            }

            function test(){
            var a = v.a;
            var b = v.b;
            var c = v.c;
            tue_dies;
            tue_das;
            }

            
            > Ich muss also im Endeffekt wieder drei Variablen definieren, damit die eigentlichen Variablen lokal vorhanden sind. Das ist natürlich ziemlich schwachsinnig. Ich werde die Variablen dann doch global definieren.  
              
            OOP in Javascript hast Du auch noch nicht so ganz verstanden. Du mußt die Variablen nicht umkopieren:  
              
            ~~~javascript
              
            function Complex(r,i)  
            {  
              this.real=r;  
              this.imag=i;  
              this.add=function(othercomplex) {  
                this.real+=othercomplex.real;  
                this.imag+=othercomplex.imag;  
              }  
              this.multiply=function(othercomplex) {  
                var tmpr=this.real*othercomplex.real-this.imag*other.imag;  
                var tmpi=this.real*othercomplex.imag+this.imag*other.real;  
                this.real=tmpr;  
                this.imag=tmpi;  
              }  
              this.toString=function() {  
                return "("+this.real+"+"+this.imag+"i)";  
              }  
              return this;  
            };  
              
            var c1=new Complex(3,4); /* komplexe Zahl (3+4i) */  
            var c2=new Complex(5,6); /* komplexe Zahl (5+6i) */  
            c1.add(c2); /* c1 := c1 + c2 */  
            alert(c1.toString()); /* "(8+10i)" */  
            
            

            Alexander

            --
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".