JavaScript Academy · Lektion

Private variabler med closures

Skjul state bag et funktionsscope.

Lektion 2 af 413 trin

Private variabler med closures er en gratis JavaScript Academy-lektion på CoddyKit. Dette er lektion 2 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.

Privathed med lukninger

JavaScript manglede længe en indbygget måde at gøre objektfelter private på. Lukninger giver en sådan mulighed: Variable inde i en funktion er usynlige udefra, men tilgængelige for funktioner, der er defineret inde i den.

function secretBox() {
  let secret = "hidden";
  return {
    reveal: () => secret
  };
}
const box = secretBox();
console.log(box.reveal()); // "hidden"
console.log(box.secret);   // undefined

En tæller med privat tilstand

Det klassiske eksempel: en tæller, hvis tælling ikke kan manipuleres direkte. Kun de returnerede metoder kan ændre den.

function makeCounter() {
  let count = 0;
  return {
    increment: () => ++count,
    value: () => count
  };
}
const c = makeCounter();
c.increment();
c.increment();
console.log(c.value()); // 2

Tilstanden er utilgængelig

Der er ingen måde at få adgang til count udefra. Forsøg på at læse den returnerer undefined; du skal gå gennem metoderne.

function makeCounter() {
  let count = 0;
  return { inc: () => ++count, get: () => count };
}
const c = makeCounter();
c.count = 100;        // creates an unrelated property
console.log(c.get()); // 0 - real count untouched

Håndhævelse af regler

Fordi adgangen går gennem metoder, kan du håndhæve invarianter, for eksempel at en saldo aldrig må blive negativ.

function account(start) {
  let balance = start;
  return {
    withdraw: (n) => {
      if (n > balance) return "insufficient";
      balance -= n;
      return balance;
    },
    balance: () => balance
  };
}
const a = account(100);
console.log(a.withdraw(150)); // "insufficient"
console.log(a.withdraw(40));  // 60

Flere private felter

En lukning kan beskytte flere variable på én gang. De er alle skjulte og deles kun mellem de returnerede metoder.

function user(name) {
  let logins = 0;
  let lastSeen = null;
  return {
    login: () => { logins++; lastSeen = "now"; },
    stats: () => ({ name, logins, lastSeen })
  };
}
const u = user("Ada");
u.login();
console.log(u.stats()); // { name: "Ada", logins: 1, lastSeen: "now" }

Private hjælpefunktioner

Det gælder ikke kun data; du kan også skjule interne funktioner. Kun de metoder, du eksponerer, er offentlige.

function temperature() {
  let celsius = 0;
  const toF = (c) => c * 9 / 5 + 32; // private
  return {
    set: (c) => { celsius = c; },
    fahrenheit: () => toF(celsius)
  };
}
const t = temperature();
t.set(100);
console.log(t.fahrenheit()); // 212

Uafhængige instanser

Hvert kald til fabrikfunktionen opretter en separat privat tilstand, så instanser aldrig påvirker hinanden.

function makeCounter() {
  let n = 0;
  return { inc: () => ++n };
}
const a = makeCounter();
const b = makeCounter();
console.log(a.inc(), a.inc()); // 1 2
console.log(b.inc());          // 1

Skrivebeskyttet eksponering

Eksponér en getter uden en setter for at gøre en værdi skrivebeskyttet udefra, mens den stadig kan ændres internt.

function timer() {
  let ticks = 0;
  setupInternally();
  function setupInternally() { ticks = 3; }
  return { ticks: () => ticks };
}
const t = timer();
console.log(t.ticks()); // 3 - no way to set it outside

Sammenligning: klassefelter

Moderne JavaScript understøtter også #private-klassefelter. Lukninger er stadig nyttige til fabrikfunktioner, og når du ønsker privathed uden klasser.

class Counter {
  #count = 0;
  inc() { return ++this.#count; }
}
const c = new Counter();
console.log(c.inc()); // 1

Derfor virker det

De returnerede metoder er lukninger over de ydre variable. Den ydre funktion har returneret, men dens område fortsætter med at eksistere, fordi lukningerne stadig refererer til det.

En memoiseringscache

Privat tilstand er fantastisk til caches. Cache-objektet forbliver skjult og bevares mellem kald.

function memoSquare() {
  const cache = {};
  return (n) => {
    if (cache[n] === undefined) cache[n] = n * n;
    return cache[n];
  };
}
const sq = memoSquare();
console.log(sq(4)); // 16
console.log(sq(4)); // 16 (cached)

Hurtig kontrol

Private variable med lukninger.

Opsamling

Lukninger skaber privathed: Variable inde i en fabrikfunktion kan ikke nås udefra, men deles mellem de returnerede metoder. Det gør det muligt at lave manipulationssikre tællere, saldi med invarianter, skjulte hjælpefunktioner og caches. Hvert kald til fabrikfunktionen giver en uafhængig tilstand. Moderne #private-klassefelter er et alternativ, men lukninger er særligt velegnede til fabrikbaseret kode.

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 “Private variabler med closures” gratis?

Ja — alle 3 lektioner i læringssporet JavaScript Academy, inklusive “Private variabler med closures”, 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 “Private variabler med closures”?

Skjul state bag et funktionsscope. 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 2 af 4.

Hvor lang tid tager lektionen “Private variabler med closures”?

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. Sådan indfanger closures state
  2. Private variabler med closures
  3. Modulmønstret (IIFE)
  4. Factory-funktioner
← Tilbage til JavaScript Academy