Aufwärmen · Aufgabe 1 von 7
// B4.1 · ca. 30 Min. · Einstieg
Funktionen deklarieren und aufrufen
Nach dieser Lektion deklarieren Sie eine Funktion mit Parametern, rufen sie mit Argumenten auf, wissen, wann sie vor ihrer Zeile aufrufbar ist, und übergeben eine Funktion an eine andere.
Lektion 1 von 5 in B4 Funktionen
Danach können Sie
- Eine Funktion mit Parametern deklarieren und mit Argumenten aufrufen, die nach Position zugeordnet werden
- Wissen, dass eine Funktionsdeklaration gehoben wird, ein const-Funktionsausdruck aber nicht vor seiner Zeile aufrufbar ist
- Eine Funktion als Wert an eine andere übergeben und den Fehler „is not a function“ lesen
Vorhersagen · Aufgabe 2 von 7
Sagen Sie es vorher, bevor Sie weiterlesen: Was gibt dieser Code aus?
console.log("one"); function sayTwo() { console.log("two"); } console.log("three");Üben · Aufgabe 3 von 7
Ergänzen Sie den Aufruf, sodass das Programm 49 ausgibt, das Quadrat von 7.
function square(n) { return n * n; } console.log(____);console.log();Üben · Aufgabe 4 von 7
In function area(width, height) { return width * height; } und der Zeile area(4, 5);: Ordnen Sie jedem Begriff zu, was er ist.
Üben · Aufgabe 5 von 7
Die Funktion steht in einer const, unterhalb des Aufrufs. Was passiert?
console.log(double(4)); const double = function (n) { return n * 2; };Denksport · Aufgabe 6 von 7
Knobelaufgabe. speak erhält als erstes Argument eine Funktion. Was gibt der Code aus?
function shout(text) { return text.toUpperCase() + "!"; } function whisper(text) { return text.toLowerCase() + "..."; } function speak(style, text) { return style(text); } console.log(speak(whisper, "HELLO")); console.log(speak(shout, "hi"));Anwenden · Aufgabe 7 von 7
Mini-Aufgabe. Deklarieren Sie eine Funktion tip(bill, percent), die das Trinkgeld zurückgibt: bill * percent / 100. Rufen Sie sie dreimal mit verschiedenen Argumenten auf und geben Sie jedes Ergebnis mit einer Beschriftung aus, etwa Tip on 40 at 10%: 4. Setzen Sie dann einen Aufruf über die Deklaration und führen Sie das Programm erneut aus: Es läuft weiter, weil Deklarationen gehoben werden.
Prüfen Sie Ihr Ergebnis anhand dieser Liste
Selbst programmieren
Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.
Ausgearbeitetes Beispiel
Ein kleiner Laden
Vier Funktionen für einen Laden: withVat schlägt 19 % Mehrwertsteuer auf, formatPrice macht aus einem Betrag Text, roundUp ist ein Funktionsausdruck, und printEach erhält eine Liste von Preisen und eine Funktion, die es auf jeden anwendet. Die erste Zeile ruft zwei Deklarationen auf, bevor sie im Code stehen: Hoisting macht das möglich. Führen Sie das Programm aus und übergeben Sie dann withVat an printEach, um die langen Nachkommastellen zu sehen.
main.js
// A small shop: functions declared once, called many times.
console.log("Net 10 ->", formatPrice(withVat(10)));
function withVat(net) {
return net * 1.19;
}
function formatPrice(amount) {
return amount.toFixed(2) + " EUR";
}
const roundUp = function (amount) {
return Math.ceil(amount);
};
function printEach(prices, change) {
for (const p of prices) {
console.log(p, "->", change(p));
}
}
printEach([4.5, 20], formatPrice);
printEach([4.5, 20.2], roundUp);
Ausführen mit
node main.jsAusgabe
Net 10 -> 11.90 EUR
4.5 -> 4.50 EUR
20 -> 20.00 EUR
4.5 -> 5
20.2 -> 21- formatPrice(withVat(10)) führt zuerst den inneren Aufruf aus: Sein Ergebnis, etwa 11.9, wird zum Argument von formatPrice.
- Zeile 2 ruft withVat und formatPrice vor ihren Deklarationen auf; das klappt, weil Deklarationen gehoben werden.
- printEach erhält formatPrice und roundUp ohne Klammern und ruft jede als change(p) auf.
- roundUp ist eine const und wird deshalb erst nach ihrer Zeile verwendet.
Ändern und ausführen
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.
Übungen
Übung 1 von 2
Ihre ersten zwei Funktionen
Vervollständigen Sie greet(name) so, dass sie "Hello, " gefolgt vom Namen und "!" zurückgibt: greet("Ada") ergibt Hello, Ada!. Vervollständigen Sie rectangleArea(width, height) so, dass sie width mal height zurückgibt. Lassen Sie das Wort export vor jeder Funktion stehen: Damit können die Tests auf dieser Seite Ihre Funktionen importieren und aufrufen. Module und export lernen Sie in Modul I3.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.
Hinweise
Hinweis 1
Führen Sie die Tests aus: Beide Funktionen geben undefined zurück, weil ihr Rumpf leer ist.
Hinweis 2
Verbinden Sie in greet die Teile mit +: "Hello, " + name + "!".
Hinweis 3
Jeder Rumpf braucht eine Zeile, die mit return beginnt, etwa return width * height;.
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
// Return "Hello, " followed by the name and "!".
export function greet(name) {
return "Hello, " + name + "!";
}
// Return the area of a rectangle: width times height.
export function rectangleArea(width, height) {
return width * height;
}
Auf dem eigenen Computer ausführen
Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.js
// Return "Hello, " followed by the name and "!".
export function greet(name) {
}
// Return the area of a rectangle: width times height.
export function rectangleArea(width, height) {
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {greet, rectangleArea} from './main.js';
test('greet("Ada") gibt Hello, Ada! zurück', () => {
assert.equal(greet('Ada'), 'Hello, Ada!', `greet("Ada") hat ${JSON.stringify(greet('Ada'))} zurückgegeben, erwartet "Hello, Ada!"`);
});
test('greet funktioniert mit jedem Namen', () => {
assert.equal(greet('Linus'), 'Hello, Linus!', `greet("Linus") hat ${JSON.stringify(greet('Linus'))} zurückgegeben, erwartet "Hello, Linus!"`);
});
test('rectangleArea(3, 4) gibt 12 zurück', () => {
assert.equal(rectangleArea(3, 4), 12, `rectangleArea(3, 4) hat ${rectangleArea(3, 4)} zurückgegeben, erwartet 12`);
});
test('rectangleArea verwendet beide Argumente', () => {
assert.equal(rectangleArea(5, 2), 10, `rectangleArea(5, 2) hat ${rectangleArea(5, 2)} zurückgegeben, erwartet 10`);
});
package.json
{
"type": "module"
}
package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.
Programm ausführen:
node main.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenÜbung 2 von 2
Zählen mit einer übergebenen Funktion
countWhere(items, check) soll die Einträge zählen, für die check(item) wahr ist. Die Tests übergeben jedes Mal eine andere Prüffunktion, etwa eine, die prüft, ob eine Zahl größer als 5 ist. Der Startcode zählt jeden Eintrag. Finden Sie heraus, warum, und korrigieren Sie ihn, sodass countWhere([3, 8, 12, 1], isBig) 2 zurückgibt.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.
Hinweise
Hinweis 1
Führen Sie die Tests aus: Der Startcode gibt für vier Zahlen 4 zurück. Ist if (check) jemals falsch?
Hinweis 2
check enthält eine Funktion, und eine Funktion ist ein truthy Wert. Das if muss verwenden, was die Funktion für diesen Eintrag zurückgibt.
Hinweis 3
Rufen Sie sie mit dem Eintrag auf: if (check(item)) { … }.
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
// Count the items for which check(item) is true.
export function countWhere(items, check) {
let count = 0;
for (const item of items) {
if (check(item)) {
count++;
}
}
return count;
}
Auf dem eigenen Computer ausführen
Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.js
// Count the items for which check(item) is true.
export function countWhere(items, check) {
let count = 0;
for (const item of items) {
if (check) {
count++;
}
}
return count;
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {countWhere} from './main.js';
const isBig = function (n) {
return n > 5;
};
test('zählt die Zahlen über 5', () => {
const got = countWhere([3, 8, 12, 1], isBig);
assert.equal(got, 2, `countWhere([3, 8, 12, 1], isBig) hat ${got} zurückgegeben, erwartet 2`);
});
test('funktioniert mit einer anderen Prüffunktion', () => {
const isEmpty = function (s) {
return s === "";
};
const got = countWhere(["a", "", "b", ""], isEmpty);
assert.equal(got, 2, `das Zählen der leeren Strings hat ${got} ergeben, erwartet 2`);
});
test('ergibt 0 für eine leere Liste', () => {
const got = countWhere([], isBig);
assert.equal(got, 0, `countWhere([], isBig) hat ${got} zurückgegeben, erwartet 0`);
});
package.json
{
"type": "module"
}
package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.
Programm ausführen:
node main.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenHäufige Fehler
Eine const-Funktion vor ihrer Zeile aufrufen
console.log(greet("Ada"));
const greet = function (name) {
return "Hello, " + name;
};
Was Node.js ausgibt
ReferenceError: Cannot access 'greet' before initializationWarum, und die Lösung
Nur Funktionsdeklarationen werden gehoben. greet ist eine const mit einem Funktionsausdruck, und wie jede const ist sie erst nach ihrer Zeile nutzbar. Setzen Sie den Aufruf unter die Definition, oder schreiben Sie eine Deklaration: function greet(name) { … }, die überall in der Datei aufrufbar ist.
Das Ergebnis statt der Funktion übergeben
function double(n) {
return n * 2;
}
function applyTo(value, change) {
return change(value);
}
console.log(applyTo(5, double(5)));
Was Node.js ausgibt
TypeError: change is not a functionWarum, und die Lösung
double(5) wird sofort aufgerufen, also erhält applyTo in change die Zahl 10, und change(value) versucht, eine Zahl aufzurufen. Die Meldung nennt den Wert, der aufgerufen wurde. Übergeben Sie die Funktion selbst, ohne Klammern: applyTo(5, double).
Ein falsch geschriebenes Schlüsselwort
fuction greet(name) {
return "Hi " + name;
}
console.log(greet("Bo"));
Was Node.js ausgibt
SyntaxError: Unexpected identifier 'greet'Warum, und die Lösung
fuction ist kein Schlüsselwort, also liest JavaScript es als Namen, und ein zweiter Name, greet, direkt dahinter ergibt keinen Sinn. Weil die Datei nicht gelesen werden kann, läuft gar nichts. Die Meldung zeigt auf greet, der Fehler ist aber das Wort davor: Schreiben Sie function.
JavaScript im Browser: die eigene Engine Ihres Browsers in einem abgeschotteten Worker. Syntaxfehler findet acorn 8.18.0, MIT. Lizenz und Quellcode
Abschlussquiz
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.