piet: Funktionsnamen im Programm ausgeben

Hallo,

ich möchte bei einem Fehler im Programm (falsche Parameter usw.) eine Alertbox öffnen

z.B. -> Fehler in Funktion xxxx. falsche Parameterübergabe

Dazu muss ich den Namen der eigenen Funktion wissen.

Gibt es hierzu einen speziellen Befehl ?

Danke henry

  1. Hallo Piet-Henry,

    wäre die Browserconsole nicht das bessere Mittel? console.error Wurde extra für Fehlermeldungen gemacht. Probier‘s mal aus.

    Gruß
    Jürgen

    1. Hallo

      console.error ist ja nur die Methode, wie ich den Fehler darstellen kann. Das ist ja nebensächlich.

      Ich brauche aber den "Befehl" der mir in einer Funktion den Namen der selbigen ausgibt.

      z.B.

      
      function berechnung(x)
      {
         if (x < 0)
         { alert("In der Funktion " + funktionsname + " wurde eine Parameter < 0 erkannt");}
      
      

      Dabei spielt alert oder console.error keine Rolle

      1. Hallo,

        dann hätte ich da noch console.trace() im Angebot.

        Aber vielleicht schreibst du mal, welches Problem du mit dem „alert(Funktionsname)“ lösen willst.

        Gruß
        Jürgen

  2. -> Fehler in Funktion xxxx. falsche Parameterübergabe Dazu muss ich den Namen der eigenen Funktion wissen.

    Ich frag mal dumm: Den hast Du doch gerade erst eben ein paar Zeilen weiter oben notiert?

    Versuchs mit this.name

    1. Hallo,

      Jede Funktion hat einen eigenen Namen aber teilweise die gleichen Fehlermeldungen. Um nur einmal den Code zu schreiben werden Variablen angegeben ...

      1. Jede Funktion hat einen eigenen Namen

        Nein. Wie auf der verlinkten Seite schon gezeigt wird gibt es anonyme Funktionen. Die haben eben keinen und ergo auch keinen eigenen Name.

    2. this.name tut nicht. Es bleibt also dabei:

      function foo() {
         console.log( foo.name );
         //document.getElementById("error").innerHTML='...' + foo.name;
      }
      foo();
      

      Das "Den hast Du doch gerade erst eben ein paar Zeilen weiter oben notiert?" bleibt gültig...

      1. OK ... vielen Dank

      2. this.name tut nicht. Es bleibt also dabei:

        function foo() {
           console.log( foo.name );
           //document.getElementById("error").innerHTML='...' + foo.name;
        }
        foo();
        

        Das "Den hast Du doch gerade erst eben ein paar Zeilen weiter oben notiert?" bleibt gültig...

        Warum es das überhaupt gibt:

        func=function foo() {
           console.log( foo.name );
           return 1;
        }
        console.log( func.name + ' returns ' + func() );
        

        Ausgaben:

        foo
        foo returns 1
        
        1. Hallo,

          gleich eine Frage 😉

          func=function foo() {
             console.log( foo.name );
             return 1;
          }
          console.log( func.name + ' returns ' + func() );
          
          

          Ist dann "func" eine private variable von "function foo() oder benötige ich eine globale variable pro function ??

          1. Tach!

            func=function foo() {
               console.log( foo.name );
               return 1;
            }
            console.log( func.name + ' returns ' + func() );
            

            Ist dann "func" eine private variable von "function foo() oder benötige ich eine globale variable pro function ??

            Weder noch. Es wurde eine Funktion erstellt. Die Angabe des Namens foo hat bei dieser Syntax keine Wirkung, insofern als dass man sie nicht darüber aufrufen kann. In func wurde eine Referenz auf diese Funktion erstellt. func ist in dem Fall eine globale Variable, also eine Eigenschaft des window-Objekts, da kein var/let/const davorgestellt wurde. Ansonsten ist es eine ganz normale Variable.

            Man braucht auch nicht für jede Funktionsreferenz eine Variable. Man kann die Referenz auch anderweitig nutzen. Beispielsweise gleich nach dem Erzeugen aufrufen:

            (function () {console.log('foo');})()
            

            Das wäre dann eine IIFE - immediately-invoked function expression.

            dedlfix.

            1. Hallo,

              vielen Dank für die Erklärung.

  3. Hallo piet,

    im Normalfall ist so was nicht sinnvoll; Parameterplausis sind eigentlich immer funktionsspezifisch und die Meldungen auch. Aber wenn Du eine Funktionsfamilie hast, oder einen Satz wiederverwendbarer Prüfungen, ann kannst Du mit arguments.callee.caller das Funktionsobjekt des Aufrufers bekommen. Und damit geht:

    function foo(a, b, c) {
       if (!validate_arguments(a, b, c))
          return false; /* or throw exception in validate function */
    
       return great_result_from_a_b_c;
    }  
    
    function validate_arguments(a, b, c) {
       if (/* arguments good */)
          return true;
    
       let caller = arguments.callee.caller;
       let callerName = caller ? caller.name : "root";
    
       alert(callerName + " is unhappy with its parameters and goes on strike!");
    }
    

    Wird foo nicht von einer anderen Funktion, sondern aus dem Root-Scope aufgerufen, ist der Caller null, darum die Abfrage.

    Bei anonymen Funktionen funktioniert das wie gesagt nicht, da kannst Du mit caller.toString() den Sourcecode des Callers ausgeben. Und die Zeilennummer, wo die Funktion definiert ist, bekommst Du auch nicht; die kennt nur der Debugger des Browsers. Es geht das Gerücht, dass man console.log mit einer eigenen Funktion überschreiben könne (die alte aber aufbewahren und nachher rekonstruieren!), so dass Du damit console.trace() abfangen kannst. Das ist dann aber schon sehr grenzwertig...

    Rolf

    --
    sumpsi - posui - clusi