Rolf B: Funktionsnamen im Programm ausgeben

Beitrag lesen

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