Joerg Peschke: Variable Argumentenzahl - stehe auf dem Schlauch :(

Moin zusammen,
Irgendwie stehe ich gerade auf dem Schlauch, Funktionsaufrufe betreffend: Ich möchte von einer JavaScript-Funktion A eine andere Funktion B aufrufen (sofern diese existiert), und zwar mit exakt den gleichen Parametern wie A. Die Parameter-Anzahl soll aber variabel sein. Mein erster, intuitiver Ansatz:

function func_a {
   if (typeof(func_b) == "function") {
      func_b (func_a.arguments);
   }
}

function func_b {
   ...
}

funktioniert nicht so richtig, weil er mir das Argumenten-Array von func_a als Referenz übergibt.
Gibts dafür eine einfache, elegante Lösung?

Danke schonmal für Hinweise jeder Art...

Jörg

  1. Hi,

    fehlen bei den funktionsbeschreibungen nicht die klammern () ?

    function func_a()   {..}

    function func_b()  {..}

    gruss
    Rondra

    1. Hi,

      fehlen bei den funktionsbeschreibungen nicht die klammern () ?

      Aeh hoppla, ja, die vergass ich, die stehen natürlich in meinen eigentlichen Funktionen drin ;)

  2. Irgendwie stehe ich gerade auf dem Schlauch, Funktionsaufrufe betreffend: Ich möchte von einer JavaScript-Funktion A eine andere Funktion B aufrufen (sofern diese existiert), und zwar mit exakt den gleichen Parametern wie A. Die Parameter-Anzahl soll aber variabel sein. Mein erster, intuitiver Ansatz:

    Gibts dafür eine einfache, elegante Lösung?

    Nein, das ganze läßt sich nur per eval lösen.

    Struppi.

    1. Gibts dafür eine einfache, elegante Lösung?

      Nein, das ganze läßt sich nur per eval lösen.

      Ich bin grad am rumbasteln, ich krieg's selbst nicht hin. Ich hatte das Problem vor kurzen auch mal (ich wollte ein printf basteln) und hab es nicht lösen können. Meine Schlußfolgerung, es gibt keine Lösung, wobei aber selbst für mich JS manchmal erstaunliche Dinge noch verborgen hält.

      Struppi.

      1. Ich bin grad am rumbasteln, ich krieg's selbst nicht hin. Ich hatte das Problem vor kurzen auch mal (ich wollte ein printf basteln) und hab es nicht lösen können.

        Ich habs jetzt auch über einen eval-Aufruf gelöst - hat sogar in meinem Spezialfall ein paar Vorteile (it's not a bug, it's a feature :) )

        Danke trotzdem.

        Ciao,
        Jörg

        1. Ich bin grad am rumbasteln, ich krieg's selbst nicht hin. Ich hatte das Problem vor kurzen auch mal (ich wollte ein printf basteln) und hab es nicht lösen können.

          Ich habs jetzt auch über einen eval-Aufruf gelöst - hat sogar in meinem Spezialfall ein paar Vorteile (it's not a bug, it's a feature :) )

          Wie denn?

          Das Problem sind ja einerseits, dass du die verschiedenen Parametertypen (strings, zahlen, objekte) unterschiedlich als Parameter zusammenbauen musst und anderseits die Funktionsreferenz nicht mehr nutzen kannst, du brauchst einen String, oder?

          Würd mich wirklich interessieren.

          Struppi.

          1. Das Problem sind ja einerseits, dass du die verschiedenen Parametertypen (strings, zahlen, objekte) unterschiedlich als Parameter zusammenbauen musst und anderseits die Funktionsreferenz nicht mehr nutzen kannst, du brauchst einen String, oder?

            Dazu muss ich ausholen, um einen Spezialfall zu beschreiben:
            Ich will/muss irgendwie in JavaScript mehrere Fenster/Frames verwalten. Mein Problem, wofür ich das oben genannte gebraucht hätte, wäre eine Notify-Methode für einen Fensterverwalter gewesen.
            Meine Idee war, wenn ein fenster irgendwas ändert, inofrmiert er den Fensterverwalter mittels einer notify-Methode.

            Fensterverwalter.notify('ereignisname' [parameter])

            z.B.: Fensterverwalter.notify ('url_change', 'http://www.foo.bar');

            Dieser ruft dann in allen Fenster eine receive_event-Funktion auf

            receive_event (ereignisname, parameter) {
               if (ereignisname == 'url_change') {
                  location.href = receive_event.arguments[1];
               }
               ...
            }

            Den Fensterverwalter hätt ich eben (wenn das in JavaScript gegangen wäre), so programmiert:

            function notify {
               /* für alle Fenster w*/
               w.receive_event(notify-arguments);
            }

            Stattdessen mache ichs jetzt so, dass der ereignisname selbst eine Funktion ist:

            function notify (ereignisname, parameterstring) {
               /* für alle fenster */
               eval (ereignisname+'('+parameterstring+')');
            }

            function urlchange (url) {
               location.href = url;}

            usw. (auf korrekten Syntax hab ich jetzt nicht geachtet :) )

            Wie gesagt, für meinen speziellen Fall eigentlich ganz cool, jezzt hab ich fast sowas wie Event-Handler, aber obs als allgemeine Lösung taugt...ich weiss nicht.

            Fröhliches Code-Crunchen,

            Jörg

        2. gruss Jörg, hallo Struppi,

          Struppi schrieb:

          Ich bin grad am rumbasteln, ich krieg's selbst nicht hin. Ich
          hatte das Problem vor kurzen auch mal (ich wollte ein printf
          basteln) und hab es nicht lösen können.

          Jörg antwortete:

          Ich habs jetzt auch über einen eval-Aufruf gelöst - hat sogar
          in meinem Spezialfall ein paar Vorteile (it's not a bug, it's
          a feature :) )

          nicht wirklich :-(   , denn, wie schon Struppi sibyllinisch meinte ...

          es gibt keine Lösung, wobei aber selbst für mich JS manchmal
          erstaunliche Dinge noch verborgen hält.

          ... halten "Function"-objekte zur loesung dieser aufgaben die methoden
             "call" bzw. "apply" bereit;

          diese beiden methoden kann ich jetzt auf die schnelle nicht mit
             einfachen worten beschreiben, aber GOOGLE ...
          http://www.google.de/search?as_q=JavaScript+referenz+Function+call+apply&num=20&hl=de&ie=UTF-8&newwindow=1&btnG=Google-Suche&as_epq=&as_oq=&as_eq=&lr=lang_de&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=
             ... fuehrt noch viel schneller zu Georg Maass, der es auf den punkt bringt:
          http://gml-modul.sourceforge.net/cgi-bin/gmL?Sprache=en&domain=dhtml-tutorial&webpage=152

          wir benoetigen also "apply", was dann am bsp. wie folgt aussieht:

          function func_a() {
               var i, argStr = "";
               for (i=0; i<arguments.length; i++) {
                 argStr += "," + arguments[i];
               }
               argStr = argStr.substring(1);

          alert("func_a:\n\narguments = " + argStr);

          if (typeof func_b == "function") {
                 alert("func_b.apply(null,arguments)");
                 func_b.apply(null,arguments);
               }
             }
             function func_b() {
               var i, argStr = "";
               for (i=0; i<arguments.length; i++) {
                 argStr += "," + arguments[i];
               }
               argStr = argStr.substring(1);

          alert("func_b:\n\narguments.callee.caller = " + arguments.callee.caller + "\n\narguments = " + argStr);
             }
             func_b("func_b","direkt","aufgerufen");
             func_a("argumente","ueber","func_a","an","func_b","gereicht");

          by(t)e by(t)e - peterS. - pseliger@gmx.net

          --
          br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)