JavaScript Academy · Lektion

Point-free-stil

Sammensæt funktioner uden at navngive argumenter.

Lektion 4 af 413 trin

Point-free-stil er en gratis JavaScript Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i JavaScript Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. JavaScript Academy-kurset indeholder 4 lektioner i alt.

Hvad er punktfri stil

Punktfri (eller tavs) stil definerer funktioner ved at kombinere andre funktioner uden at nævne deres argumenter. Argumenterne er de implicitte værdier, der føres videre.

function double(n) { return n * 2; }
const nums = [1, 2, 3];
// pointed: argument named explicitly
console.log(nums.map((n) => double(n))); // [2, 4, 6]
// point-free: no named argument
console.log(nums.map(double));            // [2, 4, 6]

Videregiv funktioner direkte

Når en tilbagekaldsfunktion blot sender sit argument videre til en anden funktion, kan du videregive funktionen ved navn i stedet for at pakke den ind.

const len = (s) => s.length;
const words = ["a", "bb", "ccc"];
console.log(words.map((w) => w.length)); // pointed: [1, 2, 3]
console.log(words.map(len));             // point-free: [1, 2, 3]

Funktionskomposition

Punktfri kode bygger på komposition: at opbygge en ny funktion ved at føre resultatet fra én funktion ind i den næste.

const compose = (f, g) => (x) => f(g(x));
const inc = (n) => n + 1;
const double = (n) => n * 2;
const incThenDouble = compose(double, inc);
console.log(incThenDouble(3)); // (3+1)*2 = 8

En pipe-hjælpefunktion

pipe læses fra venstre mod højre, hvilket mange synes er tydeligere end compose. Den anvender funktioner i rækkefølge.

const pipe = (...fns) => (x) => fns.reduce((acc, f) => f(acc), x);
const inc = (n) => n + 1;
const double = (n) => n * 2;
const f = pipe(inc, double);
console.log(f(3)); // 8

Opbygning af behandlingskæder

Med pipe kan du udtrykke en transformation i flere trin som en navngiven funktion uden nogensinde at navngive dataene.

const pipe = (...fns) => (x) => fns.reduce((a, f) => f(a), x);
const trim = (s) => s.trim();
const lower = (s) => s.toLowerCase();
const clean = pipe(trim, lower);
console.log(clean("  HELLO  ")); // "hello"

Currying muliggør punktfri stil

Currying omdanner en funktion med flere argumenter til en kæde af funktioner med ét argument. Det giver unære funktioner, der er klar til komposition.

const multiply = (a) => (b) => a * b;
const triple = multiply(3);
console.log([1, 2, 3].map(triple)); // [3, 6, 9]

Partiel anvendelse

Hvis du fastlægger nogle argumenter på forhånd, får du en specialiseret funktion, som du kan videregive direkte. Det er endnu en vej til punktfri kode.

const add = (a, b) => a + b;
const add10 = add.bind(null, 10);
console.log([1, 2, 3].map(add10)); // [11, 12, 13]

Komposition af prædikater

Du kan opbygge boolske hjælpefunktioner ud fra hinanden og dermed få rene, punktfri filtre uden støj fra indlejrede pilefunktioner.

const isEven = (n) => n % 2 === 0;
const negate = (fn) => (x) => !fn(x);
const isOdd = negate(isEven);
console.log([1, 2, 3, 4].filter(isOdd)); // [1, 3]

Afvejning af læsbarhed

Punktfri stil kan være elegant, men bliver kryptisk, hvis du går for langt. Brug den, når den tydeliggør hensigten (map(double)), og brug eksplicitte argumenter, når det gør forståelsen lettere.

const names = ["ada", "bob"];
console.log(names.map((n) => n.toUpperCase())); // ["ADA","BOB"]

Faldgruben ved metodereferencer

Hvis du videregiver en metode ved navn, kan den miste sit this. Pak den ind, eller bind den, når funktionen afhænger af en objektkontekst.

const calc = {
  factor: 2,
  scale(n) { return n * this.factor; }
};
console.log([1, 2].map(calc.scale.bind(calc))); // [2, 4]

Komposition af virkelige transformationer

Når du samler det hele, giver små navngivne funktioner, der er sat sammen i en behandlingskæde, et deklarativt, testbart og punktfrit dataflow.

const pipe = (...fns) => (x) => fns.reduce((a, f) => f(a), x);
const toNums = (arr) => arr.map(Number);
const onlyPos = (arr) => arr.filter((n) => n > 0);
const sum = (arr) => arr.reduce((a, n) => a + n, 0);
const process = pipe(toNums, onlyPos, sum);
console.log(process(["3", "-1", "4"])); // 7

Hurtigt tjek

Punktfri stil.

Opsummering

Punktfri stil opbygger funktioner ved at komponere andre funktioner uden at navngive argumenter. Videregiv funktioner som referencer (map(double)), komponér med compose/pipe, og brug currying eller partiel anvendelse til at oprette unære funktioner. Vær opmærksom på, at this kan gå tabt i metodereferencer, og brug eksplicitte argumenter, når det er mere læseligt.

Gratis at komme i gang

Lær JavaScript med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
59
Lektioner
200

Ofte stillede spørgsmål

Er lektionen “Point-free-stil” gratis?

Ja — alle 3 lektioner i læringssporet JavaScript Academy, inklusive “Point-free-stil”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. JavaScript Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Point-free-stil”?

Sammensæt funktioner uden at navngive argumenter. Du øver dig i JavaScript Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på JavaScript Academy?

Der kræves ingen tidligere erfaring. JavaScript Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Point-free-stil”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne JavaScript Academy-lektion?

Ja. Alle JavaScript Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Rene funktioner og side effects
  2. Deklarativ datatransformation
  3. Undgå mutation
  4. Point-free-stil
← Tilbage til JavaScript Academy