ECMAScript closure

Een van de meest misverstandelijke punten van ECMAScript is dat het closure ondersteunt.

Een closure is een functie die de lexicale representatie van variabelen omvat, inclusief variabelen die niet worden berekend, dus een functie kan variabelen gebruiken die buiten de functie zijn gedefinieerd.

Eenvoudig voorbeeld van een closure

Het gebruik van globale variabelen in ECMAScript is een eenvoudig voorbeeld van een closure. Overweeg het volgende stuk code:

var sMessage = "hello world";
function sayHelloWorld() {
  alert(sMessage);
}
sayHelloWorld();

In dit stuk code wordt de waarde van de variabele sMessage niet berekend nadat het script in het geheugen is geladen. De functie sayHelloWorld() vangt de waarde van sMessage alleen op voor latere gebruik, wat betekent dat de interpreter weet dat de waarde van sMessage moet worden gecontroleerd bij het aanroepen van de functie. sMessage wordt toegewezen aan de functie sayHelloWorld() bij de aanroep (laatste regel) en toont het bericht "hello world".

Complex voorbeeld van een closure

Het definiëren van een functie binnen een andere functie maakt closures complexer. Bijvoorbeeld:

var iBaseNum = 10;
function addNum(iNum1, iNum2) {
  function doAdd() {
    return iNum1 + iNum2 + iBaseNum;
  }
  return doAdd();
}

Hier bevat de functie addNum() de functie doAdd() (closure). De interne functie is een closure omdat het de waarden van de parameters iNum1 en iNum2 van de externe functie en de waarde van de globale variabele iBaseNum gebruikt. De laatste stap van addNum() roept doAdd() aan, voegt de twee parameters en de globale variabele toe, en retourneert hun som.

Belangrijke concept dat je moet begrijpen is dat de functie doAdd() geen parameters accepteert, de waarden die het gebruikt zijn afkomstig van de uitvoeromgeving.

Zoals je kunt zien, zijn closures een zeer krachtig en veelzijdig onderdeel van ECMAScript, die gebruikt kunnen worden voor complexe berekeningen.

Tip:Net zoals bij het gebruik van elke geavanceerde functie, moet je voorzichtig zijn met het gebruik van closures, omdat ze zeer complex kunnen worden.