ECMAScript lukkede funktioner

Det mest misforståelige ved ECMAScript er, at det understøtter lukkede funktioner (closure).

Lukkede funktioner refererer til en syntaksemæssig repræsentation, der inkluderer variabler, der ikke beregnes, og funktioner, hvilket betyder, at funktioner kan bruge variabler defineret uden for funktionen.

Simpelt lukket funktionseksempel

Brug af globale variabler i ECMAScript er et simpelt eksempel på lukkede funktioner. Overvej nedenstående kode:

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

I dette stykke kode beregnes variablen sMessage ikke, når skriptet indlæses i hukommelsen. Funktionen sayHelloWorld() fanger værdien af sMessage kun for fremtidig brug, hvilket betyder, at fortolkningsprogrammet ved, at værdien af sMessage skal tjekkes, når funktionen sayHelloWorld() kaldes. sMessage vil blive tildelt en værdi, når funktionen sayHelloWorld() kaldes (sidste linje), og vise beskeden "hello world".

Kompleks lukket funktionseksempel

At definere en funktion inden for en funktion gør lukkede funktioner mere komplekse. For eksempel:

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

Her inkluderer funktionen addNum() funktionen doAdd() (lukket funktion). En intern funktion er en lukket funktion, fordi den henter værdierne for de eksterne funktionens parametre iNum1 og iNum2 samt værdien af den globale variabel iBaseNum. Sidste trin i addNum() kalder doAdd(), tilføjer to parametre og den globale variabel sammen, og returnerer deres sum.

Den vigtige koncept, der skal forstås her, er, at doAdd() funktionen accepterer ingen parametre, og de værdier, den bruger, hentes fra miljøet, hvor den udføres.

Man kan se, at lukkede funktioner er et meget kraftfuldt og alsidigt element i ECMAScript, som kan bruges til at udføre komplekse beregninger.

Tip:Som med brug af enhver højere funktionsfunktion skal man være forsigtig med at bruge lukkede funktioner, fordi de kan blive meget komplekse.