Hjem » Siste artikler » While-løkker i JavaScript: slik unngår du evige løkker og hengende nettleser

While-løkker i JavaScript: slik unngår du evige løkker og hengende nettleser

Hovedillustrasjon
Hovedillustrasjon. Foto: Daniil Komov / Pexels.

Mange som lærer JavaScript opplever at koden plutselig “henger”, nettleseren fryser og ingenting svarer. Svært ofte er synderen en while-løkke som aldri tar slutt.

I denne artikkelen ser vi på hvordan while-løkker faktisk fungerer, hvorfor de lett går galt, og konkrete strategier du kan bruke for å skrive løkker som gjør det de skal uten å låse nettsiden eller Node.js-appen din.

Hva er en while-løkke, egentlig?

En while-løkke gjentar kode så lenge en betingelse er sann. Det er alt. JavaScript sjekker betingelsen før hver runde, og stopper først når betingelsen blir usann.

Den grunnleggende formen ser slik ut:

Eksempel:

let count = 0;
while (count < 3) {
  console.log(count);
  count = count + 1;
}

Her skjer tre ting som er viktige å legge merke til: vi har en startverdi (let count = 0), en betingelse (count < 3) og en oppdatering inni løkken (count = count + 1).

Den klassiske feilen: evig løkke

En evig løkke er en løkke som aldri blir ferdig. Betingelsen blir aldri usann, så JavaScript fortsetter for alltid (eller til nettleseren gir opp). I praksis betyr det at siden eller programmet ditt slutter å svare.

Dette skjer som regel av tre grunner: du glemmer å oppdatere variabelen i det hele tatt, du oppdaterer i feil retning, eller du har en betingelse som aldri kan bli usann.

Tre typiske eksempler på evige løkker

1. Helt glemt oppdatering

let i = 0;
while (i < 10) {
  console.log(i);
  // mangler i = i + 1;
}

Her blir i aldri større enn 0, så i < 10 er alltid sant.

2. Oppdatering i feil retning

let i = 0;
while (i < 10) {
  console.log(i);
  i = i - 1; // går bort fra målet
}

Du vil at i skal nærme seg 10, men du trekker fra i stedet for å legge til. Resultatet er at i går nedover mot minus uendelig.

3. Betingelse som aldri endres

while (true) {
  console.log("Hei");
}

Dette er bevisst en evig løkke. Den kan være nyttig i enkelte typer systemer, men i vanlig frontend-kode vil den nesten alltid være en feil.

En liten sjekkliste før du kjører en while-løkke

Du kan unngå mange problemer ved å gå gjennom en enkel mental sjekkliste hver gang du skriver en while-løkke.

Still deg disse tre spørsmålene:

  • Har jeg en tydelig startverdi for variabelen i betingelsen?
  • Er betingelsen formulert slik at den til slutt blir usann hvis alt går riktig?
  • Oppdateres verdien inni løkken på en måte som nærmer seg å gjøre betingelsen usann?

Hvis du kan peke konkret på hvor og hvordan betingelsen blir usann, er du på god vei.

Når bør du bruke while i stedet for for?

Mange situasjoner der nybegynnere bruker while, kan med fordel skrives med en for-løkke. For-løkken tvinger deg til å tenke startverdi, betingelse og oppdatering på ett sted.

While passer best når du ikke vet på forhånd hvor mange ganger du skal gjenta noe, men du vet at du skal fortsette helt til en tilstand eller et svar endres.

Eksempel: lesing av input til brukeren skriver “stopp”

Tematisk illustrasjon
Tematisk illustrasjon. Foto: Markus Winkler / Pexels.

La oss si at du i en Node.js-app vil lese linjer fra terminalen til noen skriver ordet “stopp”. Her er while naturlig:

let line = getNextLine(); // tenkt funksjon
while (line !== "stopp") {
  console.log("Du skrev:", line);
  line = getNextLine();
}

Her kjenner vi ikke antall runder, men vi har en klar sluttbetingelse: brukeren skriver “stopp”.

Slik “tørrkjører” du en while-løkke i hodet

Før du kjører koden, er det lurt å simulere noen runder manuelt. Dette hjelper deg å oppdage evige løkker før de låser skjermen.

Prøv dette hver gang du er usikker:

  1. Skriv ned startverdien.
  2. Spør: er betingelsen sann nå? Hvis nei, løkken kjører aldri.
  3. Hvis ja, gjør du én runde: tenk gjennom hva som skjer inni løkken og oppdater variablene.
  4. Gå tilbake til punkt 2 med de nye verdiene.

Hvis du etter noen runder ser at verdiene ikke nærmer seg noe som kan gjøre betingelsen usann, har du trolig en logisk feil.

Begrens skaden: maksantall runder

Noen ganger er det lurt å ha en sikkerhetssperre, spesielt når du jobber med data du ikke helt kontrollerer, eller komplekse betingelser du ikke er helt trygg på.

Du kan for eksempel legge på en teller som stopper løkken etter et visst antall runder, selv om hovedbetingelsen fortsatt er sann:

let attempts = 0;
let maxAttempts = 1000;
while (hasMoreData() && attempts < maxAttempts) {
  processData();
  attempts = attempts + 1;
}
if (attempts === maxAttempts) {
  console.warn("Løkken ble stoppet etter maks antall runder.");
}

Dette løser ikke logiske feil, men det hindrer ofte programmet i å låse seg helt. Det er spesielt nyttig i eksperimentell kode, under utvikling eller i skript som leser store datamengder.

Debugging: hva gjør løkken din akkurat nå?

Når en while-løkke ikke oppfører seg som du forventer, handler feilsøkingen ofte om å se hva som skjer med variablene for hver runde.

En grei teknikk er å logge både betingelsen og relevante variabler inni løkken:

let i = 0;
while (i < 5) {
  console.log("i:", i, "betingelse:", i < 5);
  i = i + 2;
}

Denne typen logging gjør det lettere å se om tallene går i riktig retning, eller om en streng aldri endres, eller om en funksjon alltid returnerer samme verdi.

While-løkker og asynkron JavaScript

En vanlig misforståelse er å tro at en while-løkke “venter” på at noe skal skje, for eksempel at en nettverksforespørsel blir ferdig. Det gjør den ikke. Mens løkken kjører, blokkerer den alt annet i JavaScript-tråden.

Hvis du trenger å vente på noe asynkront (som fetch eller databasen), er det ofte bedre å bruke async/await sammen med andre mønstre, ikke en tett while-løkke.

Et typisk anti-mønster ser slik ut:

let done = false;
fetchData().then(() => {
  done = true;
});
while (!done) {
  // "venter" på at done skal bli true
}

Her får done aldri sjansen til å bli true, fordi nettleseren er opptatt med å kjøre løkken. Løsningen er å tenke i asynkrone steg i stedet for å spinne i en while.

Oppsummering: tenk på while som en avtale

En while-løkke er en avtale du gjør med deg selv: “Jeg lover å forandre ting inni løkken slik at betingelsen blir usann etter hvert.” Hvis du ikke holder den avtalen, får du problemer.

Hvis du hver gang sjekker start, betingelse og oppdatering, tørrkjører noen runder i hodet og er forsiktig med asynkron kode, kan du bruke while-løkker trygt, både i små skript og større JavaScript-prosjekter.

0 kommentarer