JS: Anonüümsed funktsioonid | Noolefunktsioonid

Javascript pakub erinevaid viise funktsioonide loomiseks ja kasutamiseks. Üks neist on klassikalised funktsioonid, mida vaatlesime eelmises peatükis. Klassikalised funktsioonid on nimetatud funktsioonid, mis võivad võtta argumente, omada keha ja tagastada väärtusi. Neid funktsioone saab defineerida ja kutsuda, et täita konkreetseid ülesandeid või teostada teatud arvutusi.

Lisaks klassikalistele funktsioonidele on JavaScriptis olemas ka teisi funktsiooni liike. Näiteks anonüümsed funktsioonid ja selle uus versioon noolefunktsioonid.

Anonüümsed funktsioonid

Anonüümsed funktsioonid on nimetamata funktsioonid, mis luuakse otse koodis ning neid kasutatakse sageli kohapeal, kus neid vaja on. Selle asemel, et funktsioonile anda kindel nimi, luuakse anonüümne funktsioon otse muutujasse, argumendina või atribuudina. Anonüümseid funktsioone saab kasutada mitmel viisil, olenevalt vajadusest. NB! Lõppu lisatakse semikoolon ;

// Anonüümse funktsiooni näide
var tervita = function() {
  console.log("Tere maailm!");
};

// Anonüümse funktsiooni kutsumine
tervita();

Siin on näide anonüümsest funktsioonist argumentide kasutamisel, mis tagastab summa kahe arvu vahel

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

var tulemus = summa(3, 5);
console.log(tulemus); // Väljund: 8

Anonüümseid funktsioone saab kasutada argumentidena teistele funktsioonidele, näiteks sündmuste käitlemiseks või ajaliste viivituste loomiseks.

// Anonüümne funktsioon koos argumendiga
setTimeout(function() {
  console.log("Tere pärastlõunast!");
}, 1000);

Anonüümseid funktsioone saab kasutada massiivi elementide kuvamiseks mitmel erineval viisil. Näiteks forEach meetodi kasutamine

var array = [1, 2, 3, 4, 5];

array.forEach(function(element) {
  console.log(element);
});

forEach meetod võib vastu võtta ka teisi parameetreid, näiteks indeksi või massiivi ennast:

const array = [1, 2, 3, 4, 5];

array.forEach(function(element, index, array) {
  console.log("Element:", element);
  console.log("Index:", index);
  console.log("Array:", array);
});

Eeliste osas võib öelda, et anonüümsed funktsioonid pakuvad paindlikkust ja lihtsust, eriti olukordades, kus on vaja luua väikesi, ühekordseid funktsioone. Neil on oluline roll ka sündmustepõhises programmeerimises ja asünkroonsetes operatsioonides.

Klassikalised funktsioonid pakuvad rohkem struktureeritust ja taaskasutatavust. Neid saab kasutada laiemas kontekstis ja need võimaldavad keerukamaid tüüpi operatsioone, sealhulgas rekursiooni ja objektorienteeritud programmeerimist.

Mõlemad funktsiooni liigid on kasulikud ja nende valik sõltub konkreetsest olukorrast ning arendaja eelistustest. Mõnikord võib olla vaja kasutada nii anonüümseid kui ka klassikalisi funktsioone, et saavutada parim tulemus.

IIFE (Immediately Invoked Function Expression)

IIFE (Immediately Invoked Function Expression) on anonüümse funktsiooni alaliik. IIFE on nimetatud selle järgi, kuidas see kohe pärast loomist kohe välja kutsutakse.

IIFE koosneb anonüümsest funktsioonist, mis on ümbritsetud sulgudega. See anonüümne funktsioon on koheselt väljakutsutud, tavaliselt lisades () paare selle järel.

IIFE-d eristatakse teistest anonüümsetest funktsioonidest selle poolest, et neid kutsutakse välja kohe pärast nende loomist, samal real, kus need on defineeritud. See eristab neid tavalistest anonüümsetest funktsioonidest, mis võivad olla defineeritud ilma kohest väljakutsumisteta.

(function() {
  var x = 10;
  console.log(x); // Output: 10
})();

Noolefunktsioonid

Uue Javascripti versiooniga ES6 tutvustati uut lähenemist anonüümsete funktsioonide loomisel – noolefunktsioon (arrow function). See on anonüümse funktsiooni alaliik Javascriptis. Noolefunktsioonid on lihtsustatud süntaksiga funktsioonid, mis kasutavad nooleoperaatorit (=>) funktsioonikeha defineerimiseks.

Noolefunktsioonide eeliseks on lühem ja selgem süntaks ning automaatne sidumine väliskeskkonnaga (this-sidumine). Need võimaldavad kergemini ja loetavamalt kirjutada anonüümseid funktsioone.

Siin on näide noolefunktsioonist

const noolFunktsioon= () => {
  // funktsiooni keha
};

Ehk lihtne tervitus näeks välja järgmine

const noolFunktsioon = () => {
  console.log("Tere noolfunktsioon!")
};

noolFunktsioon();

Kui funktsiooni kehas on ainult üks avaldus, siis saame isegi loogelised sulud {} ära jätta.

const noolFunktsioon = () => console.log("Tere noolfunktsioon!");
noolFunktsioon();

Ja argumentidega ja massiiviga funktsiooni näited

//noolefunktsioon argumentidega
let tervita = (nimi) => {console.log(`Tere ${nimi}`)};
tervita("Juhan");

//noolefunktsioon lihtsustatud - KUI ARGUMENTE ON ÜKS, SIIS VÕIB KA NEED SULUD ÄRA JÄTTA
let tervita2 = nimi => console.log(`Tere ${nimi}`);
tervita2("Mari");

//kui kehas on rohkem ridu, siis sulud jäävad
let liitmine = (a, b) => {
  let result = a + b;
  return result;
};
console.log(liitmine(3,5));

//noolefunktsioon lihtsustatud argumentidega
let liitmine = (a, b) => a + b;
console.log(liitmine(3,5));

//noolefunktsioon ja massiviist elementide kuvamine
const array = [1, 2, 3, 4, 5];
array.forEach(element => console.log(element));

Eriti läheb huvitavamaks, kui lisada mitu lühendatud koodi kokku. Näiteks funktsioon, mis leiab kas arv on paaris või paaritu

const number = 5;
const isEven = number => number % 2 === 0 ? "paaris" : "paaritu";

console.log(isEven(number)); // Väljund: paaritu

Ja sama näide massiivi korral

const arvud = [1, 2, 3, 4, 5];

arvud.forEach(nr => {
  const paaris = nr % 2 === 0 ? "paaris" : "paaritu";
  console.log(`${nr} is ${paaris}`);
});
function kuvaNimiKlassika() {
    console.log("Roman");
}
kuvaNimiKlassika();

const kuvaNimiNoole = () => console.log("Roman");
kuvaNimiNoole();

function kuupaevEesti(kuupäev) {
    const kuud = ["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"];
    const päev = kuupäev[0]+kuupäev[1];
    const kuu = kuupäev[3]+kuupäev[4];
    const aasta = kuupäev[6]+kuupäev[7];
    const kuuIndex = kuu - "01";
    console.log(aasta + ". " + kuud[kuuIndex] + " " + päev);
}
kuupaevEesti("25.07.19");

function arvutaKeskmineJaKoguarv(numbrid) {
    let summa = 0;
    numbrid.forEach(function(nr) { summa = summa + nr; });
    let koguarv = numbrid.length;
    let keskmine = summa / koguarv;
    console.log("koguarv: " + koguarv + ", keskmine: " + keskmine);
}
arvutaKeskmineJaKoguarv([2,5,7,10]);

const salajaneSonum = sonum => {
    let tulemus = "";
    const häälikud = ["a","e","i","o","u","õ","ä","ö","ü","A","E","I","O","U","Õ","Ä","Ö","Ü"];
    sonum.split("").forEach(function(täht) {
        let onHäälik = false;
        häälikud.forEach(function(h) { if(h === täht) onHäälik = true; });
        if(onHäälik) tulemus = tulemus + "*";
        else tulemus = tulemus + täht;
    });
    console.log(tulemus);
};
salajaneSonum("Tere tulemast, Roman!");

const leiaUnikaalsedNimed = nimed => {
    let unikaalsed = [];
    let kontroll = {};

    for (let i = 0; i < nimed.length; i++) {
        if (!kontroll[nimed[i]]) {
            unikaalsed.push(nimed[i]);
            kontroll[nimed[i]] = true;
        }
    }

    return unikaalsed;
};

const tulem = leiaUnikaalsedNimed(["Kati", "Mati", "Kati", "Mari", "Mati", "Jüri"]);
console.log(tulem);