info@a-coding-project.de

Beispiele: Parameter in JavaScript

Parameter sind ein wichtiger Bestandteil von JavaScript - doch sie können mehr als einfach nur Werte übergeben.

Variable Parameterlisten

In JavaScript - als einer 'nicht typisierten' Sprache - braucht sich der Benutzer normalerweise nicht um die Parameter einer Funktion zu kümmern, sie sind einfach durch ihre Position in der Parameterliste bestimmt. Doch bei höheren Ansprüchen werden die Grenzen dieser Freiheit sehr bald spürbar. In dieser Serie erfahren Sie, wie man sie überwinden kann.
JavaScript ist eine "nicht typisierte Sprache" - im Gegensatz etwa zu "streng typisierten Sprachen", wie C oder C++, wo jede Variable vor ihrem ersten Gebrauch mit einem gewissen Datentyp deklariert werden muss und fortan nur mehr mit genau diesem Typ verwendet werden kann. Vorteile hat das bei größeren Programmen mit einer Vielzahl von Variablen, die der Mensch leicht verwechseln kann. Da ist es ganz gut, wenn der Compiler gleich jede Verwechslung als fehlerhaft markiert.

In JavaScript jedoch gibt es keinen Compiler, sie ist eine "Interpretersprache". Der Interpreter ist in vielen Browsern gleich eingebaut, jedoch in sehr verschiedenem Umfang. Das volle JavaScript ist nur im Microsoft Internet Explorer (MS-IE) verfügbar, der heute allerdings einen Marktanteil von 86% hat. Wenn Sie JavaScript -Programme schreiben, die auf verschiedenen Browsern funktionieren sollen, dann sollten Sie diese unbedingt mit allen diesen testen, bevor Sie sie ins Internet hochladen.

Ein häufiges Problem ist es, eine Funktion mit einer variablen Zahl von Parametern zu schreiben. (Ist doch eigentlich absurd, nicht wahr? Die Bedeutung eines Parameters ergibt sich aus seiner Position - diese aber ist variabel?)

Nun, JavaScript ist so universell, dass auch dieser scheinbare Widerspruch gelöst wurde: Die Bedeutung eines Parameters ergibt sich weiterhin aus seiner Position, allerdings gibt es dafür keine obere Grenze. Eine Funktion wird zwar nur mit einer gewissen Zahl von Parametern deklariert, doch kann sie mit einer beliebigen Zahl aufgerufen werden.

So bedeutet etwa die Deklaratin:
function xyz(param)
konzeptionell eigentlich
function xyz(param,...)

Intern erfolgt der Zugriff auf einen Parameter nicht über seinen Namen, sondern er wird einfach wie ein Feld in einem Array verwendet. Dieses Array heißt in JavaScript arguments und bildet einen Teil der Funktions-Deklaration - muss also mit dem Namen der jeweiligen Funktion qualifiziert werden. Dann kann der i-te Parameter zugegriffen werden mit xyz.arguments[i].
Zu jedem Array gibt es in JavaScript in Attribut length . Da ja die Länge der Parameterliste bei der Funktions- Deklaration noch nicht bekannt ist, braucht man dieses Attribut, wie Sie in folgendem Beispiel sehen.

Für dieses Beispiel wurde angenommen, gewünscht sei eine Funktion, die einfach die Summe einer beliebigen Zahl von Parametern berechnet. Ihre Deklaration könnte so aussehen:

function Summe(param)
{
  var i, sum = 0;
  for(i=0; i < Summe.arguments.length; i++)  
    sum += Summe.arguments[i];
  return sum;
}

Unterschiedliche Verwendung von Parametern

In JavaScript -Funktionen sind die Parameter durch ihre Position in der Parameterliste festgelegt - sollte man meinen. Mit dem typeof()-Operator aber kann man einen Parameter ganz unterschiedlich behandeln, je nachdem wie er beim Aufruf der Funktion übergeben wurde.
Ein häufiges Problem bei Aufruf von JavaScript -Funktionen ist, dass der Mensch dazu neigt, ein Detail geistig auszublenden, wenn es im Moment keine Rolle spielt. Der JavaScript -Interpreter im Browser aber nimmt das ganz genau: wenn ein Parameter "leer" ist, dann soll zumindest 0, "" (leerer String) oder undefined für ihn eingesetzt werden.
Für die Programmier-Produktivität ist es deshalb besser, einen Parameter vor der eigentlichen Verarbeitung zuerst mit typeof() zu untersuchen. Je nach dem Ausgang wurde dieser Parameter beim Aufruf als number, string, boolean, object, function oder undefined übergeben und sollte entsprechend behandelt werden.
Versuchen Sie mal, die folgende Beispiel-Funktion mit verschiedenen Parametern aufzurufen:

function Test(param)
{
  switch(typeof(param))
  { 
    case 'number': alert('param = '+param+' (Typ: number)');
    break;
    case 'string': alert('param = '+param+' (Typ: string)');
    break;
    case 'boolean': alert('param = '+param+' (Typ: boolean)');
    break;
    case 'object': alert('param = '+param+' (Typ: object)');
    break;
    case 'function': alert('param = '+param+' (Typ: function)');
    break;
    case 'undefined': alert('param = '+param+' (Typ: undefined)');
    break;
   }
}

Zum Testen von object werden Sie erst mal in HTML ein Objekt erzeugen und mit dessen Identifier dann diese Funktion aufrufen müssen, zum Beispiel:

<BR id="x">
<SCRIPT>Test(x)</SCRIPT>

Ein häufiger Fall, wo man sich damit das Leben sehr erleichtern kann, ist eine Funktion deren Parameterliste mit zwei Parametern endet, die jeweils nur in gewissen Fällen gebraucht, ansonsten aber einfach weggelassen werden:

function xyz(... ... ... ,options, debug)
{
  ... 
}

Parameter options ist, falls gebraucht, ein string (womit einige Feinheiten der Verarbeitung gesteuert werden). Wie der Name schon sagt, ist er "optional" - das heißt, er wird nicht in jedem Fall gebraucht.
Parameter debug ist eine number, die den Feinheitsgrad der Zwischenausgaben während der Software-Entwicklung steuert - im produktiven Einsatz jedoch nie gebraucht wird.
Was macht nun der Programmierer während der Software-Entwicklung, wenn er eine solche Funktion debuggen will, jedoch ohne options? - Er ruft sie ganz einfach mit einem numerischen Parameter am Ende der Parameterliste auf und kümmert sich gar nicht um die options - zum Beispiel:

function xyz(... ... ... , 1)

Denn er weiß, dass diese Funktion folgendermaßen deklariert wurde:

function xyz(... ... ...,options, debug)
{
  if(typeof(options) == 'number') 
  { 
    debug = options;  options = undefined; 
  }
  ...
}

Parameter in Form von JavaScript-Code

"Eine JavaScript -Funktion legt den Algorithmus zur Verarbeitung der Parameter eindeutig fest" - aber nur bei relativ einfachen Anwendungen. Man kann einen Parameter auch als string übergeben, der "zufällig" genau einem JavaScript -Code entspricht. Intern wird dieser Code dann ausgewertet und ggf. ausgeführt - dank der Methode eval().
Beim Aufruf einer JavaScript -Funktion kann es sein, dass der Anwender eine Aktion wünscht, abhängig von einer Bedingung. Diese Bedingung wird vernünftigerweise so formatiert sein, wie man das auch in JavaScript ausdrücken würde.
Dann kann diese Bedingung mittels der Methode eval() ausgewertet werden, wie Sie in folgendem Beispiel sehen:

function Auswerten(cond,x)
{
  if(eval(cond))  
    alert("x (= "+x+") erfüllt Bedingung '"+cond);
  else 
    alert("x (= "+x+") erfüllt Bedingung '"+cond+" nicht");
}

Rufen Sie diese Funktion einmal auf! Zum Beispiel mit den Parametern auf:

Auswerten("x > 5",6);
Auswerten("x > 5",3);

eval() ist ein enorm vielseitiges Werkzeug. Man kann damit nicht nur einen String auswerten (wenn er "zufällig" der JavaScript -Notation entspricht), sondern auch einen JavaScript -String ausführen. Zum Beispiel könnte man in die Funktion des obigen Beispiels noch zwei weitere Parameter einführen, die angeben, was in dem einen und was im anderen Fall geschehen soll:

function Auswerten(cond,x,operation1,operation2)
{
  if(eval(cond))  
    eval(operation1);
  else 
    eval(operation2);
}

Was meinen Sie, was passiert, wenn Sie diese Funktion mit den folgenden zwei Aufrufen aktivieren? - Probieren Sie's aus!

Auswerten("x > 5",3,"alert('x = '+x+' - Bedingung erfüllt')",
          "alert('x = '+x+' - Bedingung nicht erfüllt')");
Auswerten("x > 5",6,"alert('x = '+x+' - Bedingung erfüllt')",
          "alert('x = '+x+' - Bedingung nicht erfüllt')");

Das funktioniert sogar, wenn eine der beiden Operationen weggelassen wird, zum Beispiel:

Auswerten("x > 5",6,"alert('x = '+x+' - Bedingung erfüllt')");
Auswerten("x > 5",3,"alert('x = '+x+' - Bedingung erfüllt')");
Auswerten("x > 5",7,"alert('x = '+x+' - Bedingung erfüllt')");

Beim zweiten Aufruf ist operation2 intern undefined, wird also nicht ausgeführt. Erst beim dritten Aufruf kommt wieder eine alert-Box auf den Bildschirm.

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant