Zum Hauptinhalt springen

Funktionen

Funktionsaufruf

sayHi();

const result = addNumbers(5, 8);

Function declarations

Deklarierte Funktionen sind überall in der Datei (Bzw. in ihrem Scope) aufrufbar.
Sie haben immer einen Namen.

Einfache Funktion:

function printTime() {
const d = new Date();
console.log(`Es ist ${d.getHours()}:${g.getMinutes()});
}

Funktion mit Parametern und Rückgabewert:

function addNumbers(a, b) {
return a + b;
}

Function expressions

Funktionen können auch Teil eines Ausdrucks sein. Damit können wir Funktionen in einer Variable ablegen oder als Argument an eine andere Funktion übergeben.
In diesem Fall müssen Funktionen keinen Namen haben (Anonymous Function), können aber (Named Function).

const func = function(param) {
return param ** 2;
}
const result = func(2);
// Als Argument:
anotherFunc(func);

Arrow functions

Arrow Functions sind eine alternative Syntax für Funktionsausdrücke (function expression).
Diese sind ähnlich als "Lambda"-Funktionen auch in Java oder Python zu finden.
Vorteile:

  • Schlanke Syntax
  • Impliziter Rückgabewert (Kein return)
  • Erleichtert funktionale Programmierung
// Mit einem Parameter
const func = x => x ** 2;

// Mit mehreren Parametern
const addNumbers = (a, b) => a + b;

// Mehrzeilige Funktion auch möglich
const longerFunc = (a, b) => {
if (a <= 0 || b <= 0) {
return null;
}
// ACHTUNG! return ist hier nötig
return a + b;
}

Scope and closures

Scope

Der Scope bestimmt die Sichtbarkeit und Lebensdauer von Variablen in JavaScript.
Wenn eine Funktion beendet ist, wird der Scope verlassen und alle inneren Variablen werden aufgeräumt.

let outer = 1;
function addOuterAndInner() {
const inner = 2;
// Hier sind 'outer', 'inner' und 'number' sichtbar
return outer + inner;
}
const resultA = addOuterAndInner(); // -> 3
outer = 2;
const resultB = addOuterAndInner(); // -> 4
// Hier ist 'outer' sichtbar, 'number' gibt es nicht
const resultC = outer + inner; // Error

Closure

Eine Closure entsteht, wenn eine Funktion auf Variablen aus ihrem äußeren Scope zugreift. Auch nachdem dieser äußere Scope bereits ausgeführt wurde, bleiben die Variablen "am Leben". Dies ist eines der mächtigsten Konzepte in JavaScript.

function createAddFunction(base) {
const example = 'hi';
// 'base' und 'example' sind nur hier drinnen sichtbar.
return function generatedAddFunction(toAdd) {
// 'base' ist im Closure von generatedAddFunction
return base + toAdd;
}
// 'example' wird hier aufgeräumt. 'base' bleibt im Speicher
}
const addTwo = createAddFunction(2);
addTwo(5); // -> 7