Aufwärmen · Aufgabe 1 von 7
Zum Aufwärmen: triple ist eine Pfeilfunktion. Was gibt dieser Code aus?
const triple = (n) => n * 3;
console.log(triple(4));// B4.4 · ca. 30 Min. · Einstieg
Nach dieser Lektion schreiben Sie Pfeilfunktionen, wissen, wo ein let oder const gilt, und können erklären, was sich eine Closure merkt.
Danach können Sie
Aufwärmen · Aufgabe 1 von 7
const triple = (n) => n * 3;
console.log(triple(4));Vorhersagen · Aufgabe 2 von 7
const makeUser = (name) => { name: name };
console.log(makeUser("Ada"));Üben · Aufgabe 3 von 7
const makeUser = (name) => ____;
console.log(makeUser("Ada"));Üben · Aufgabe 4 von 7
const city = "Berlin";
function show() {
const city = "Hamburg";
console.log(city);
}
show();
console.log(city);Üben · Aufgabe 5 von 7
Denksport · Aufgabe 6 von 7
function makeCounter() {
let count = 0;
return () => {
count += 1;
return count;
};
}
const a = makeCounter();
const b = makeCounter();
a();
a();
console.log(a(), b());Anwenden · Aufgabe 7 von 7
Prüfen Sie Ihr Ergebnis anhand dieser Liste
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
Das Programm schreibt drei Pfeilfunktionen: eine mit kurzem Rumpf, eine mit Blockrumpf und eine, die ein Objekt in runden Klammern zurückgibt. Es übergibt einen Pfeil direkt als Callback an printEach. Dann zeigen drei Konstanten namens place den Modul-, Funktions- und Block-Scope, und makeGreeter gibt Pfeile zurück, die sich ihren Gruß merken. Führen Sie es aus, entfernen Sie dann die runden Klammern um das Objekt in makeItem und führen Sie es erneut aus.
main.js
// Arrow functions, three scopes and a first closure.
const double = (n) => n * 2;
const describe = (item, price) => {
const label = price > 10 ? "expensive" : "cheap";
return `${item} is ${label}`;
};
const makeItem = (name, price) => ({name: name, price: price});
console.log(double(21));
console.log(describe("tea", 4));
console.log(makeItem("tea", 4));
function printEach(values, change) {
for (const value of values) {
console.log(value, "->", change(value));
}
}
printEach([1, 2, 3], (n) => n * 10);
const place = "module";
function showScope() {
const place = "function";
if (place === "function") {
const place = "block";
console.log("in the block:", place);
}
console.log("in the function:", place);
}
showScope();
console.log("at the top:", place);
function makeGreeter(greeting) {
return (name) => `${greeting}, ${name}!`;
}
const hello = makeGreeter("Hello");
const hi = makeGreeter("Hi");
console.log(hello("Ada"));
console.log(hi("Linus"));
Ausführen mit
node main.jsAusgabe
42
tea is cheap
{ name: 'tea', price: 4 }
1 -> 10
2 -> 20
3 -> 30
in the block: block
in the function: function
at the top: module
Hello, Ada!
Hi, Linus!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.
Übung 1 von 2
Drei Pfeilfunktionen im Startcode geben das Falsche zurück. square(n) soll n mal n zurückgeben. wrap(value) soll ein Objekt mit einem Schlüssel value zurückgeben, sodass wrap(5) { value: 5 } liefert. isBetween(n, low, high) soll true zurückgeben, wenn n zwischen low und high liegt, beide eingeschlossen. Lassen Sie export vor jeder Konstante stehen, damit die Tests sie importieren können.
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.
Führen Sie die Tests aus: square und wrap geben undefined zurück. Was beginnen geschweifte Klammern direkt nach =>?
Ein Blockrumpf braucht return. Oder lassen Sie die geschweiften Klammern weg: (n) => n * n gibt den Ausdruck zurück.
Setzen Sie bei wrap das Objekt in runde Klammern: (value) => ({value: value}). Verbinden Sie bei isBetween zwei Vergleiche mit &&.
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
// Return n times n.
export const square = (n) => n * n;
// Return an object with one key, value, holding the argument.
export const wrap = (value) => ({value: value});
// Return true when n is from low to high, both included.
export const isBetween = (n, low, high) => n >= low && n <= high;
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 n times n.
export const square = (n) => {
n * n;
};
// Return an object with one key, value, holding the argument.
export const wrap = (value) => { value: value };
// Return true when n is from low to high, both included.
export const isBetween = (n, low, high) => false;
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {square, wrap, isBetween} from './main.js';
test('square(4) gibt 16 zurück', () => {
assert.equal(square(4), 16, `square(4) hat ${square(4)} zurückgegeben, erwartet 16`);
});
test('square funktioniert mit negativen Zahlen', () => {
assert.equal(square(-3), 9, `square(-3) hat ${square(-3)} zurückgegeben, erwartet 9`);
});
test('wrap(5) gibt ein Objekt mit dem Schlüssel value zurück', () => {
assert.deepEqual(wrap(5), {value: 5}, `wrap(5) hat ${JSON.stringify(wrap(5))} zurückgegeben, erwartet {"value":5}`);
});
test('isBetween schließt beide Enden ein', () => {
assert.equal(isBetween(1, 1, 10), true, `isBetween(1, 1, 10) hat ${isBetween(1, 1, 10)} zurückgegeben, erwartet true`);
assert.equal(isBetween(10, 1, 10), true, `isBetween(10, 1, 10) hat ${isBetween(10, 1, 10)} zurückgegeben, erwartet true`);
});
test('isBetween ist außerhalb des Bereichs false', () => {
assert.equal(isBetween(11, 1, 10), false, `isBetween(11, 1, 10) hat ${isBetween(11, 1, 10)} zurückgegeben, erwartet false`);
assert.equal(isBetween(0, 1, 10), false, `isBetween(0, 1, 10) hat ${isBetween(0, 1, 10)} zurückgegeben, erwartet false`);
});
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
total(prices) soll die Preise addieren und die Summe zurückgeben, doch der Aufruf bricht mit ReferenceError: sum is not defined ab. Verschieben Sie eine Zeile, damit sum lange genug lebt. makeMultiplier(factor) soll eine Funktion zurückgeben, die ihr Argument mit factor multipliziert, sodass makeMultiplier(3) eine Verdreifachungsfunktion liefert. Der Startcode ignoriert factor. Lassen Sie den zurückgegebenen Pfeil factor verwenden.
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.
Führen Sie die Tests aus: total bricht mit einem ReferenceError ab. Wo wird sum deklariert, und wo wird es gelesen?
Ein let gehört zu den geschweiften Klammern um ihn herum. sum muss vor der Schleife im Funktionsrumpf deklariert werden, damit return es noch sieht. Dort beginnt es auch nur einmal bei 0.
In makeMultiplier kann der Pfeil factor verwenden, weil er in der Funktion erzeugt wurde: (n) => n * factor.
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
// Add up all prices and return the sum.
export function total(prices) {
let sum = 0;
for (const price of prices) {
sum += price;
}
return sum;
}
// Return a function that multiplies its argument by factor.
export function makeMultiplier(factor) {
return (n) => n * factor;
}
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
// Add up all prices and return the sum.
export function total(prices) {
for (const price of prices) {
let sum = 0;
sum += price;
}
return sum;
}
// Return a function that multiplies its argument by factor.
export function makeMultiplier(factor) {
return (n) => n * 2;
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {total, makeMultiplier} from './main.js';
test('total([2, 3, 5]) gibt 10 zurück', () => {
const got = total([2, 3, 5]);
assert.equal(got, 10, `total([2, 3, 5]) hat ${got} zurückgegeben, erwartet 10`);
});
test('die Summe einer leeren Liste ist 0', () => {
const got = total([]);
assert.equal(got, 0, `total([]) hat ${got} zurückgegeben, erwartet 0`);
});
test('makeMultiplier(3) gibt eine Verdreifachungsfunktion zurück', () => {
const triple = makeMultiplier(3);
assert.equal(typeof triple, 'function', `makeMultiplier(3) hat ${typeof triple} zurückgegeben, erwartet eine Funktion`);
assert.equal(triple(4), 12, `makeMultiplier(3)(4) hat ${triple(4)} zurückgegeben, erwartet 12`);
});
test('zwei Multiplikatoren behalten ihren eigenen Faktor', () => {
const triple = makeMultiplier(3);
const half = makeMultiplier(0.5);
assert.equal(half(10), 5, `makeMultiplier(0.5)(10) hat ${half(10)} zurückgegeben, erwartet 5`);
assert.equal(triple(2), 6, `makeMultiplier(3)(2) hat ${triple(2)} zurückgegeben, erwartet 6`);
});
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 herunterladenconst makePoint = (x, y) => { x: x, y: y };
console.log(makePoint(1, 2));
Was Node.js ausgibt
SyntaxError: Unexpected token ':'Warum, und die Lösung
Geschweifte Klammern direkt nach => beginnen immer einen Blockrumpf. In einem Block ist x: ein Label, und das Komma mit dem zweiten y: ergibt keinen Sinn, also kann die Datei nicht gelesen werden und nichts läuft. Mit nur einem Schlüssel gibt es gar keinen Fehler: Der Pfeil gibt still undefined zurück. Setzen Sie das Objekt in runde Klammern: (x, y) => ({x: x, y: y}).
const prices = [4, 6];
for (const price of prices) {
let sum = 0;
sum += price;
}
console.log(sum);
Was Node.js ausgibt
ReferenceError: sum is not definedWarum, und die Lösung
sum ist im Schleifenrumpf deklariert, existiert also nur innerhalb dieser Klammern, und bei jedem Durchlauf entsteht ein neues sum mit 0. Nach der Schleife ist der Name verschwunden. Deklarieren Sie ihn vor der Schleife, in dem Scope, in dem Sie ihn am Ende brauchen: let sum = 0; über dem for.
const shout = (text) => {
text.toUpperCase() + "!";
};
console.log(shout("hi").length);
Was Node.js ausgibt
TypeError: Cannot read properties of undefined (reading 'length')Warum, und die Lösung
Mit geschweiften Klammern hat der Pfeil einen Blockrumpf, und ein Blockrumpf gibt nur zurück, was eine return-Anweisung liefert. Hier gibt es keine, also ist shout("hi") undefined, und .length von undefined zu lesen schlägt fehl. Schreiben Sie return text.toUpperCase() + "!"; oder lassen Sie die geschweiften Klammern für einen kurzen Rumpf weg: (text) => text.toUpperCase() + "!".
JavaScript im Browser: die eigene Engine Ihres Browsers in einem abgeschotteten Worker. Syntaxfehler findet acorn 8.18.0, MIT. Lizenz und Quellcode
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.