ROBBESTAD ARCHIVErecovered 2026-09-01

ARCHIVE FILE

Engangsfunksjon i JavaScript

written
archived
source
inbeta.no (Inmeta)

Hadde det ikke vært nyttig med en funksjon som bare kjørte en gang, og som ryddet opp etter seg når jobben var gjort?

Jeg vedder på du fra tid til annen skriver en funksjon som du bare har lyst til å kalle en gang. Hadde det ikke vært nyttig om denne funksjonen faktisk bare kunne kalles en gang, og fjernet seg selv jobben var gjort?

Det ville selvfølgelig vært nyttig, og her er nettopp en slik funksjon.

function once (fn) {
  var f = function () {
    if (f.hasResult) return f.value;
    f.hasResult = true;
    return f.value = fn.apply(this, arguments);
  }
  f.hasResult = false;
  return f;
}

Tenk på once-funksjonen som en wrapper som svøper om funksjonen du egentlig vil kalle. Wrapperen har en kontrollvariabel som kjenner igjen om funksjonen er kjørt, og returner resultatet i stedet for å kjøre funksjonen dersom den tidligere er kjørt.

// Demo
var runOnce = once(function(arg) {
  var dobbel = arg + arg;
  console.log("Funksjon kjøres");
  return dobbel;
});

var result='';
// "Funksjon kjøres" skrives ut
result = runOnce(5);
// Resultat er 10
console.log(result);
// Ingenting blir skrevet ut
result = runOnce(5);
// Resultat er fortsatt 10
console.log(result);

← index