Closure

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

In de informatica is een closure een combinatie van een functie met een eigen lokaal variabelenbereik (of: omgeving, Engels: environment) waarbij de functie gebruik maakt van één of meer variabelen in dit bereik. Wanneer de functie aangeroepen wordt heeft deze toegang tot de variabelen in dit bereik, ook al liggen deze buiten het aanroepende bereik.

Closures worden vooral gebruikt in functionele programmeertalen (zoals Haskell en OCaml) en programmeertalen die sterk gebaseerd zijn op functionele talen (zoals JavaScript).

Voorbeeld in JavaScript[bewerken]

var maakClosure = function(a) {
  return function(b) { return a+b; };
};

De bovenstaande JavaScript-functie retourneert een closure. We kunnen deze functie gebruiken om als volgt twee closures te verkrijgen:

var closure1 = maakClosure(3);
var closure2 = maakClosure(8);

Deze functies kunnen we vervolgens weer als "gewone" functies gebruiken:

var x = closure1(4);  // x is nu 7
var y = closure2(4);  // y is nu 12

De twee functies closure1() en closure2() hebben beide hun eigen variabele a. De variabele a maakt deel uit van het lokale bereik dat met elk van de 2 closures geassocieerd is en valt buiten het bereik van code buiten de functie maakClosure().

Privé-variabelen[bewerken]

Met behulp van closures is het mogelijk een functie één of meer privé-variabelen te geven die blijven bestaan tussen de verschillende aanroepen van die functie. Dit is vergelijkbaar met variabelen die met een object geassocieerd worden (attributen) in objectgeoriënteerd programmeren. Het volgende voorbeeld in JavaScript kan dit verduidelijken:

var maakClosure = function() {
  var a = 0;
  return function() {
    a++;
    return a;
  };
};

De functie maakClosure() retourneert weer een closure:

var closureA = maakClosure();

De functie closureA() heeft nu een privé-variabele a, die blijft bestaan tussen de aanroepen van closureA() door:

var x = closureA();  // x is nu 1
var y = closureA();  // y is nu 2!
var z = closureA();  // z is nu 3, enzovoort..