Tuesday, September 18, 2012

JavaScript als funktionale Programmiersprache – Teil 1



Cover-klein in JavaScript als funktionale Programmiersprache - Teil 1 - Ajaxer
Obwohl der Kern von JavaScript relativ einfach ist, folgt JavaScript keinem strengen Programmierparadigma. Hier wird JavaScript als funktionale Programmiersprache dargestellt, denn ohne die funktionalen Aspekte lassen sich die weiteren Aspekte der Sprache nur schwer beschreiben.
Funktionen werden verwendet, um Anweisungen zusammenzufassen. In Funktionen zusammengefasste Anweisungen dienen der Wiederverwendung und der Strukturierung des Codes. In JavaScript sind Funktionen Sprachbestandteile erster Ordnung. Sie sind Objekte. Wie jedes andere Objekt kann man eine Funktion einer Variablen zuweisen, anderen Funktionen als Parameter übergeben oder als Rückgabewert zurückgeben. Weil Funktionen Objekte sind, können sie selbst auch weitere Funktionen und Eigenschaften (Member-Variablen bzw. Properties) enthalten.

Funktionsliteral

Funktionsliterale erzeugen Funktionsobjekte. Funktionsobjekte sind echte JavaScript-Objekte. Sie sind eine Instanz des Function-Objekts.
Das Funktionsliteral wird durch das reservierte Wort function eingeleitet. Danach folgt ein optionaler Funktionsname. Wenn ein Funktionsname angegeben wird, spricht man statt vom Funktionsliteral auch von der Funktionsanweisung. Der Name der Funktion wird in der name-Eigenschaft des Funktionsobjekts gespeichert.
Die Parameter einer Funktion werden in Klammern als eine kommaseparierte Liste übergeben. Diese Parameter können in der Funktion als Variablen verwendet werden. Die Anzahl der Parameter stehen im Funktionsobjekt als length-Eigenschaft zur Verfügung. Der Rumpf der Funktion folgt den Parametern in geschweiften Klammern.
  function plus(x, y) {
       return x + y;
    }
    print(plus(1,2)); // 3
Der Aufruf einer Funktion unterbricht den Programmablauf (das Programm selbst wird natürlich nicht unterbrochen) und übergibt die Kontrolle an die Funktion.
Der Programmablauf wird fortgesetzt, wenn die Funktion über eine return-Anweisung beendet wird oder wenn die letzte Zeile der Funktion erreicht ist. Die return-Anweisung kann also auch verwendet werden, um eine Funktion vorzeitig zu beenden. Wenn keine return-Anweisung vorhanden ist, dann wird von der Funktion undefined zurückgegeben.
Funktionen als Konstuktor-Funktionen aufrufen
Achtung: Wenn die Funktion wie ein Konstruktor-Objekt über die new-Anweisung aufgerufen wird, dann wird statt undefined das erzeugte Objekt zurückgegeben, falls die Funktion selbst keine Objekt als Rückgabewert hat!

Funktionsnamen

ls Funktionsnamen sind alle gültigen JavaScript-Bezeichner (reservierte Wörter wie null oder function sind keine gültigen JavaScript-Bezeichner) möglich. Es ist aber eine Konvention, den Namen der Funktion mit einem Verb in Kleinbuchstaben zu beginnen und CamelCase-Schreibweise für zusammengesetzte Namen zu verwenden. Interne Funktionen, die nicht zu einer öffentlichen API gehören, werden per Konvention von einem Unterstrich »_« eingeleitet.

Parameter

Funktionen lassen sich in JavaScript nicht anhand der Parameter überladen. Dies bedeutet, dass die Funktion auch dann aufgerufen wird, wenn mehr oder weniger Parameter übergeben werden. Nicht vorhandene Parameter stehen innerhalb der Funktion nicht zur Verfügung, sondern sind undefined. Wenn zu viele Parameter übergeben werden, dann werden die überflüssigen Parameter ignoriert bzw. stehen im Bonusparameter (siehe unten!) zur Verfügung.
  function plus(x, y) {
       return x + y;
  }
  print(plus(1,2,3)); // 3
  print(plus()); // NaN
Alle übergebenen Parameter stehen neben den automatisch erzeugten Variablen zusätzlich im Bonusparameter, dem Array arguments, zur Verfügung. So lassen sich auch Funktionen mit einer beliebigen Anzahl von Parametern schreiben.
  function plusAll() {
       var result = 0;
       for (var i in arguments) {
          result += arguments[i];
       }
       return result;
  }
  print(plusAll()); //0 print(plusAll(1,2,3,4,5)); // 15
Das Arguments-Array
Achtung: Das Array arguments ist kein echtes Array. Es hat zwar ein length-Attribut und man kann über dieses iterieren, allerdings fehlen ihm die Methoden eines echten Array-Objekts.