ECMAScript 闭包

ECMAScript 最易让人误解的一点是,它支持闭包(closure)。

Suljetut lohkot tarkoittavat funktioita, joiden lexikaalinen ilmaisu sisältää ei-laskettuja muuttujia, eli funktio voi käyttää muuttujia, jotka on määritelty sen ulkopuolella.

Yksinkertainen suljetun lohkon esimerkki

Globaalisten muuttujien käyttö ECMAScriptissä on yksinkertainen esimerkki suljetuista lohkoista. Tarkkaile seuraavaa koodia:

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

Yllä olevassa koodissa skripti ladataan muistiin, mutta funktio sayHelloWorld() ei laske muuttujan sMessage arvoa. Funktio sayHelloWorld() tallentaa sMessage-arvon vain myöhemmää käyttöä varten, eli tulkki tietää, että sen on tarkistettava sMessage-arvo funktiota kutsuttaessa. sMessage asetetaan funktiota kutsuttaessa sayHelloWorld() (viimeinen rivi) ja näyttää viestin "hello world".

Monimutkainen suljetun lohkon esimerkki

Toinen funktio funktiossa tekee suljetuista lohkoista monimutkaisempia. Esimerkiksi:

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

Tässä, funktio addNum() sisältää funktio doAdd() (suljettu lohko). Sisäinen funktio on suljettu lohko, koska se käyttää ulkoisen funktion parametreja iNum1 ja iNum2 sekä globaalin muuttujan iBaseNum arvoa. addNum() viimeinen askel kutsuu doAdd(), lisää kaksi parametria ja globaalin muuttujan, ja palauttaa niiden summan.

Tärkeä käsitteeseen liittyvä seikka on, että doAdd() -funktio ei ota vastaan parametreja, vaan käyttää arvoja, jotka saadaan suoritusympäristöstä.

Voimme nähdä, että suljetut lohkot ovat ECMAScriptissä erittäin voimakkaita ja yleiskäyttöisiä osia, joita voidaan käyttää monimutkaisten laskentojen suorittamiseen.

Vinkki:Käyttäessäsi sulkeita, olet varovainen, koska ne voivat tulla erittäin monimutkaisiksi.