Private variabler med closures
Skjul state bag et funktionsscope.
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); // undefinedEn 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()); // 2Tilstanden 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 untouchedHå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)); // 60Flere 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()); // 212Uafhæ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()); // 1Skrivebeskyttet 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 outsideSammenligning: 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()); // 1Derfor 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.
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
- Sådan indfanger closures state
- Private variabler med closures
- Modulmønstret (IIFE)
- Factory-funktioner