JavaScript

JAVASCRIPTIIN LIITTYVÄÄ KOULUTUSTA VUONNA 2025!

Kurssit saatavilla kautta Suomen. Tule ja varaa oma koulutustapahtumasi heti! Koulutuksen järjestää asiantuntijasi Koulutus- ja konsultointipalvelu KK Mediat.

Callback-funktiot ja klosuurit JavaScriptillä toteutettuna

Callback-funktiot

Yksi modernin JavaScriptin tärkeimmistä konsepteista ovat callback-funktiot. Yksinkertaistettuna callback tarkoittaa funktion välittämisestä argumenttina toiselle funktiona. Tämä on mahdollista, koska JavaScriptissä funktio itsessään on natiivi tietotyyppi.


function sayHello(sName) {
    console.log('Hello ' + sName);
};

function greet (sName, fCallback) {
    fCallback(sName);
}

greet('Keijo', sayHello);   // tulostaa Hello Keijo

Callback-funktiot ovat erityisen hyödyllisiä silloin, kun haluamme suorittaa jonkin toiminnon vasta kun jokin muu toiminto on valmis. Tämä on erityisen tärkeää asynkronisessa ohjelmoinnissa, kuten tapahtumankäsittelijöissä, fetch/XHR-pyynnöissä, sekä funktionaalisessa ohjelmoinnissa.

Seuraavassa koodiesimerkissä hyödynnetään setTimeOut-funktiota viivästyttämään suoritusta ja tulostamaan data konsoliin kun määrätty viive on kulunut. Tämä callbackia hyödyntävä lähestymistapa on yleinen ratkaisumalli asynkronisisten operaatioiden käsittelyssä.


function haeTiedot(callback) {
    setTimeout(() => {
        const data = "Tiedot haettu";
        callback(data);
    }, 1000);
}

haeTiedot(function(response) {
    console.log(response); // "Tiedot haettu"
});

Klosuurit

Toinen modernin JavaScriptin keskeinen käsite ovat klosuurit (closure). Klosuuri muodostuu, kun funktio palauttaa funktion, ja palautetulla funktiolla on pääsy ulompien funktioiden muuttujien arvoihin.

Seuraavassa esimerkissä laskeYhteensa()-funktio palauttaa toisen funktion, joka voi säilyttää ja päivittää summa-muuttujan arvon. Vaikka ulompi funktio on jo suoritettu, sisempi funktio voi silti käyttää ja muokata sen sisältämiä muuttujia klosuurin kautta:


function laskeYhteensa() {
    let summa = 0;
    return function(luku) {
        summa += luku;
        console.log(summa);
    };
}

const summaFn = laskeYhteensa();
summaFn(5); // 5  - eli 0+5
summaFn(10); // 15  -- eli 5+10
summaFn(3); // 18  -- eli 15 + 3

Tämä mekanismi mahdollistaa monenlaisia käytännöllisiä ratkaisuja, kuten yksityisten muuttujien luomisen ja tilan ylläpitämisen funktioiden välillä, ilman altistumista globaalille näkyvyysalueelle.