Funktionen
Wir haben sie bereits verwendet, wir haben selber etliche geschrieben, nur was ist das?
Eine Funktion ist eine Zusammenfassung mehrere Anweisungen zu einem Block. Eine Funktion wird (in der Regel) über Ihren Namen aufgerufen. Ihr können Parameter übergeben werden und sie kann einen Rückgabewert haben.
Nehmen wir die Funktion getState(). Der Funktion übergeben wir die id des States, den wir haben möchten. Als Rückgabewert erhalten wir dann den Zustand des States. Gut, eine Funktion verwendet man, wenn man sie braucht. Wann aber schreibt man eine Funktion? Dann, wenn man muss, oder wenn man sie braucht. Wir brauchen z.B. eine Funktion bei der Funktion subscribe() bzw. on().
on({id: 'hm-rpc.1.IEQ053xxxx.1.PRESS_SHORT‘}, function (obj) {
setState("hm-rpc.1.IEQ038xxxx.3.State",!getState("hm-rpc.1.IEQ038xxxx3.State").val);
setState("hm-rpc.1\. IEQ056xxxx.3.State",!getState("hm-rpc.1\. IEQ056xxxx.State").val);
});
Die Funktion ist der Bereich > function (obj) { … }
In diesem Fall hat die Funktion keinen Namen. Wichtig ist folgendes festzuhalten:
-
Eine Funktion ist mit dem Schlüsselwort function gekennzeichnet.
-
Eine Funktion kann einen Namen haben. Beispiel function irgendetwas. Der Name kann nach den gleichen Regeln wie der Name einer Variablen gewählt werden.
-
Einer Funktion kann ein oder mehrere Werte Übergeben werden. In dem Beispiel wird ein Wert, obj, übergeben. Mehrere Werte werden durch Komma übergeben. Die Werte werden von Runden Klammern eingeschlossen. Wird kein Wert übergeben, so bleibt der Raum zwischen den runden Klammern leer.
-
In den geschweiften Klammern wird dann die Anweisungen wie in einem ganz normalen Programm geschrieben.
-
Eine Funktion kann einen Wert zurückgeben.
Nur wann schreibt man sonst noch eine Funktion. Eine Funktion hilft dabei, ein Programm zu strukturieren und übersichtlicher zu gestalten. Gerade wenn ein Programmabschnitt mehrfach verwendet werden soll, macht es Sinn, ihn in eine Funktion auszugliedern. Zum Beispiel wollen wir an verschiedenen Stellen eines Programms die Temperatur schön formatieren. Das Programm könnte so aussehen:
console.log('Wohnzimmer: '+formatTemp(20));
console.log('Küche: '+formatTemp(18.27));
function formatTemp(temp) {
return(temp.toFixed(1)+'°C');
}
Die Funktion selber gibt nichts aus (könnte sie natürlich). Vielmehr gibt sie per return einen Wert zurück, den wir dann ausgeben. Ob sich für so eine einfache Aufgabe bereits eine Funktion lohnt liegt im Auge des Betrachters. Dem typografisch versierten Leser dürfte aufgefallen sein, dass man zwischen der Zahl und °C eigentlich ein Leerzeichen schreibt. Wenn wir dieses in der Funktion korregieren, brauchen wir den Rest des Programms nicht mehr kontollieren. Also auch bei so einem kleinen Programm kann es Sinn machen.
Der Name der Funktion ist eine Variable. Daher müsste eigentlich auch folgendes gehen:
console.log('Wohnzimmer: '+formatTemp(20));
console.log('Küche: '+formatTemp(18.27));
var formatTemp=function (temp) {
return(temp.toFixed(1)+'°C');
};
Das Programm beschert uns jetzt aber leider einen Fehler:
> Test: ReferenceError: formatTemp is not defined at script.js
Das hängt damit zusammen, dass wir zunächst die Funktion (Variable) verwenden und diese erst später definiert wurde. So geht es:
var formatTemp=function (temp) {
return(temp.toFixed(1)+'°C');
};
console.log('Wohnzimmer: '+formatTemp(20));
console.log('Küche: '+formatTemp(18.27));
Daher macht es in der Regel Sinn bei der Deklaration der FUnktion auch den Namen anzugeben. Bei dieser Schreibweise kommt es im Skript (fast) nicht darauf an, wo die Funktion deklariert wird. Idealer Weise schreibt man erst das eigentliche Programm und hängt am Ende die Hilfsfunktionen an.
Wenn man der Funktion selber den Namen gibt sind Rekursionen möglich. Ein Rekursion ist eine Funktion, die sich selber aufruft. Es gibt Situationen in denen dieses notwendig ist. Nach Möglichkeiten sollte man diese wegen ihrer schlechten Lesbarkeit vermeiden. EIn Beispiel hierzu ist die Fakultät eine Zahl. Die Fakultät von 3 ist 6. Die Fakultät ist eine mathematische Funktion, die einer natürlichen Zahl das Produkt aller natürlichen Zahlen (ohne Null) kleiner und gleich dieser Zahl zuordnet. Bei 3 wird also gerechnet: 123=6
Das Programm könnte hierzu wie folgt aussehen:
function fac(n) {
if (n<2) {
console.log(n);
return 1;
} else {
console.log(n+'*')
return n*fac(n-1)
}
}
console.log('='+fac(3));
Wichtig ist die Zeile
return n*fac(n-1)
Hier ruft sich die Funktion selber auf. Bei der Variablenschreibweise wäre das nicht möglich.
Trotzdem wäre ein solches Kontrukt nicht notwendig gewesen. Mit einer for-Schleife wäre das eleganter gewesen:
function fac(n) {
var ergebnis=1;
for(var i=2;i<=n;i++) ergebnis*=i;
return ergebnis;
}
console.log(fac(3));
Einer Funktion können beliebig viele Argumente übergeben werden. Spannend ist es, wenn die Zahl der Argumente variiert. Hier gibt es die Möglichkeit diese mit dem arguments Objekt abzufragen:
`function printArgs() {
var result = "";
var i;
for (i = 0; i < arguments.length; i++) {
result += arguments[i] + ', ';
}
return result;
}
console.log(printArgs(1,2,3,4,'Maus'));` [/i]