Funktionen
Deklaration/Definition
Funktionen können auf drei verschiedene Arten erzeugt werden:
function-Schlüsselwort und Deklarationfunction-Schlüsselwort in Ausdrücken- fat-arrow-Syntax in Ausdrücken
Funktions-Deklaration
function doubleValue(z) {
return z * 2;
}function doubleValue(z) {
return z * 2;
}Funktions-Ausdruck / Anonyme Funktion
const tripleValue = function (z) {
return z * 3;
};const tripleValue = function (z) {
return z * 3;
};Fat-Arrow Syntax
const halfValue = (z) => {
return z / 2;
};
const add = (a, b) => a + b;const halfValue = (z) => {
return z / 2;
};
const add = (a, b) => a + b;Auch wenn es Unterschiede bei den drei Varianten gibt (Hoisting, this-Bindung), können sie in der Regel gleichartig benutzt werden.
Argumente
Optional und Default-Werte
Argumente sind immer optional (von rechts nach links) und können Default-Werte haben:
function demoFunction(arg1, arg2 = 'world', arg3) {
console.log(arg1, arg2, arg3);
}
myFunction('hello'); // "hello", "world", undefinedfunction demoFunction(arg1, arg2 = 'world', arg3) {
console.log(arg1, arg2, arg3);
}
myFunction('hello'); // "hello", "world", undefinedVariable Argumente-Liste / Argumente-Array
Wir können alle übergebenen Argumente mit der rest-Syntax ... in einem Array konsumieren.
Zudem verfügen Funktionen, die über das function-Schlüsselwort definiert werden, auch über ein arguments-Objekt im Scope (Das gilt also nicht für die Fat-Arrow-Syntax).
Die bessere Praxis ist es aber immer, die rest-Syntax zu benutzen.
function variableArgsFunction(arg1, ...rest) {
console.log(arg1, rest);
console.log(arguments);
console.log(rest instanceof Array, arguments instanceof Array);
}
variableArgsFunction('hello', 'a', 'b', 'c');function variableArgsFunction(arg1, ...rest) {
console.log(arg1, rest);
console.log(arguments);
console.log(rest instanceof Array, arguments instanceof Array);
}
variableArgsFunction('hello', 'a', 'b', 'c');Rückgabe
Single Return Value
Funktionen können einen einzelnen Wert zurückgeben - per Default undefined.
function returnHello() {
return 'Hello';
}
function returnUndefined() {
return undefined;
}
function returnUndefinedImplicit() {
return;
}
function noReturnButUndefined() {}function returnHello() {
return 'Hello';
}
function returnUndefined() {
return undefined;
}
function returnUndefinedImplicit() {
return;
}
function noReturnButUndefined() {}Multiple Values
Um mehrere Werte zurückzugeben, müssen diese als Objekt oder Array zurückgebeben werden.
Funktionen sind Objekte
In JavaScript ist jede Funktion auch nur ein Objekt.
function add(a,b) { return a + b; }
console.log(add.length);
console.log(add.name);
console.log(add.toString());function add(a,b) { return a + b; }
console.log(add.length);
console.log(add.name);
console.log(add.toString());Insbesondere gibt es sogar einen Funktions-Konstruktor:
const sub = new Function('x','y','return x+y;');
console.log(sub(17,4));const sub = new Function('x','y','return x+y;');
console.log(sub(17,4));Innere Funktionen
Funktionen können auch innerhalb von anderen Funktionen definiert werden (sowohl über eine Deklaration als auch über einen Funktions-Ausdruck). Ihre Sichtbarkeit (scope) beschränkt sich dann auf die Funktion.
function outerFn() {
function innerFn1() {}
const innerFn2 = function() {};
const innerFn3 = () => {};
// Alle drei inneren Funktionen sind hier sichtbar
}
// Keine der inneren Funktionen ist hier sichtbarfunction outerFn() {
function innerFn1() {}
const innerFn2 = function() {};
const innerFn3 = () => {};
// Alle drei inneren Funktionen sind hier sichtbar
}
// Keine der inneren Funktionen ist hier sichtbarFunktionen sind First-Class-Citizens
Funktionen in können als Ausdruck überall verwendet werden, wo in JavaScript Ausdrücke erlaubt sind. Insobesondere also bei der Zuweisung an Variablen, bei der Übergabe von Argumenten an andere Funktionen oder auch als Rückgabe-Wert.
High Order Functions
Funktionen höherer Ordnung sind Funktionen, die andere Funktionen als Argument bekommen.
function doSomething(callback) {
// ...
callback(42);
}
doSomething((value) => {
console.log('Done', value);
});function doSomething(callback) {
// ...
callback(42);
}
doSomething((value) => {
console.log('Done', value);
});Function Factory
Wir können also auch eine Funktion in einer anderen zusammenbauen und zurückgeben.
function createHider(elt) {
function hideElt() {
elt.style.display = 'none';
}
return hideElt;
}function createHider(elt) {
function hideElt() {
elt.style.display = 'none';
}
return hideElt;
}
JavaScript Docs