David Hörpel: Frage zu Funktion mit arguments

Hallo!

Kann mir einer sagen, was bei der unteren Funktion falsch gemacht habe?

function farbe(x)
{

alert(x);
}

function satzteil(y)
{
alert(y);
alert(farbe.arguments[0]);
}

Ich würde gerne in der Funktion Satzteil auf die variable x aus der Funktion farbe zugreifen. Sobald ich jedoch die zweite Funktion aufrufe, wird mir bei der Ausführung des Codesalert(farbe.arguments[0]); der JS-Fehler angezeigt, dass farbe.arguments[0] Null oder kein Objekt ist. Dabei ist die Variable eindeutig gefüllt...

Gruß David

  1. [code=javascript]
    function satzteil(y) {
      alert(y);
      alert(satzteil.arguments[0]);
    }
    [/code]

    Die Argumente kann man nur von der eigenen Funktion bestimmen;
    nicht aber von anderen (wie auch, da die andere Funktion
    gar nicht aufgerufen wird/wurde).

    1. Wenn auf eine Variabel aus einer anderen Funktion zugegriffen
      werden soll, dann kann diese global definert und gesetzt werden
      (nicht so schön, aber was soll's):

      [code=javascript]
        var globalVar;

      function farbe(x) {
          globalVar = x;
        }

      function satzteil(y) {
          alert(globalVar);
        }
      [/code]

  2. hi,

    Kann mir einer sagen, was bei der unteren Funktion falsch gemacht habe?

    du hast </faq/#Q-11> nicht beachtet, obwohl es in deinem ersten thread um ein gleichartiges problem ging.

    function farbe(x)
    { ... }

    function satzteil(y)
    {
    alert(y);
    alert(farbe.arguments[0]);
    }

    Ich würde gerne in der Funktion Satzteil auf die variable x aus der Funktion farbe zugreifen. Sobald ich jedoch die zweite Funktion aufrufe, wird mir bei der Ausführung des Codesalert(farbe.arguments[0]); der JS-Fehler angezeigt, dass farbe.arguments[0] Null oder kein Objekt ist. Dabei ist die Variable eindeutig gefüllt...

    das ist schön für die variable.
    aber der aufruf der funktion farbe() ist längst wieder beendet - also gibt es da jetzt keine arguments mehr auszulesen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. Hallo David,

    Ich würde gerne in der Funktion Satzteil auf die variable x aus der Funktion farbe zugreifen. Sobald ich jedoch die zweite Funktion aufrufe, wird mir bei der Ausführung des Codesalert(farbe.arguments[0]); der JS-Fehler angezeigt, dass farbe.arguments[0] Null oder kein Objekt ist. Dabei ist die Variable eindeutig gefüllt...

    wie meine Vorredner schon gesagt haben, ist beim Aufruf der Funktion satzteil() die Funktion farbe() bereits abgelaufen. Damit ist ein Zugriff auf die Parameter nicht mehr möglich.

    Allerdings ist in JavaScript jede Funktion gleichzeitig ein Objekt und diesem Objekt können Eigenschaften zugeordnet werden. Auf diese Art und Weise kann auf sehr einfacher Art und Weise der Wert eines Parameters zwischengespeichert werden.

    Beispiel:

    <html>
    <head>
    <title>Testseite</title>

    </head>
    <body><pre><script type="text/javascript">
    <!--
    function farbe(param) {
    farbe.param = param;
    document.writeln("farbe aufgerufen: " + param  );
    }

    function satzteil() {
    if (!satzteil.i) {
         satzteil.i = 1;
    } else {
         satzteil.i++;
    }

    return (satzteil.i + ". Aufruf satzteil ruft farbe: " + farbe.param);
    }

    farbe(3);
    document.writeln(satzteil());
    farbe(4)
    document.writeln(satzteil());
    farbe(5)
    setTimeout("alert(satzteil())",200);

    //-->
    </script></pre></body>
    </html>

    Viele Grüße

    tp

    1. Hallo,

      Allerdings ist in JavaScript jede Funktion gleichzeitig ein Objekt und diesem Objekt können Eigenschaften zugeordnet werden. Auf diese Art und Weise kann auf sehr einfacher Art und Weise der Wert eines Parameters zwischengespeichert werden.

      Ausgefallene Methode, aber was ist daran einfacher im Vergleich zu globalen Variablen? Bei praktischen Aufgabenstellungen sehe ich keinen Vorteil der Speicherung als Eigenschaft des Function-Objekts. Globale Variablen erscheinen mir zunächst am einfachsten. Die fortgeschrittenere Variante wäre die koordinierte Weitergabe von Daten über Parameter. So ist der Informationsfluss immer transparent und die Scopes "sauber". Es gibt auch Möglichkeiten, alle Variablen eines Funktions-Scopes weiterzugeben. Wenn es so kompliziert sein muss, ist man schnell bei OOP angekommen. Meines Erachtens sind diese Methoden immer logischer und klarer als das Speichern der Daten eines Funktionsaufrufs am Function-Objekt, damit andere Funktionen darauf zugreifen können. Warum gerade dort?

      Mathias