Adriana Pikaljov Portfoolio

en_GBet

JS: Anonüümsed funktsioonid | Noolefunktsioonid

Anonüümsed funktsioonid

Anonüümsed funktsioonid on nimeta funktsioonid, mida luuakse otse koodis ja kasutatakse seal, kus neid parajasti vaja on. Neile ei anta nime – need pannakse otse muutujasse, antakse argumendina edasi või kasutatakse omadusena. Neid kasutatakse siis, kui on vaja lühidalt ja kiiresti funktsiooni määratleda.

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

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

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

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

IIFE (Immediately Invoked Function Expression)

IIFE (Immediately Invoked Function Expression) on anonüümne funktsioon, mis käivitatakse kohe selle loomisel.

See pannakse sulgudesse ja kutsutakse kohe välja, lisades lõppu veel ühed sulud ().

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.

Noolefunktsioonid

ES6 versioonis lisati JavaScripti noolefunktsioonid (arrow functions) – lihtsustatud viis anonüümsete funktsioonide loomiseks. Need kasutavad noolemärki => ja on lühema ning selgema süntaksiga.

Noolefunktsioonid seovad automaatselt ka väliskonteksti (this), mis teeb nende kasutamise mugavamaks ja koodi loetavamaks.

näide noolefunktsioonist:

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

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

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

Ja argumentidega ja massiiviga funktsiooni näited

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

Ja sama näide massiivi korral

Noolefunktsioone ei saa kasutada, kui:

  • Konstruktorifunktsioonides – need ei loo uut objekti, sest neil puudub oma this.
  • Objekti meetoditenathis ei viita objektile, vaid ümbritsevale keskkonnale.
  • Prototüüpimeetoditenathis ei viita õigesti objektile, seega need ei tööta oodatult.

Tagasikutsumisfunktsioon (Callbacks)

Tagasikutsumisfunktsioon (callback) on funktsioon, mida antakse teisele funktsioonile argumendina ja kutsutakse hiljem välja, kui mingi tegevus on lõpetatud.

Seda võib võrrelda tagasihelistamisega – sa annad kellelegi ülesande ja ta “helistab sulle tagasi”, kui töö on valmis.

Tegelikult eespool näidetes me seda forEach puhul kasutasime, aga selguse huvides vaatame uuesti üle. Javascripti forEach meetod võtab vastu callback-funktsiooni argumendina ja seejärel kutsub seda funktsiooni iga massiivi elemendi jaoks.

Võime funktsiooni ka eraldi luua ja siis selle välja kutsuda.

Ja veel parem, me saame selle panne kirja noolefunktsioonina

Näide lihtsast AJAX API päringust koos callback-funktsiooniga, kasutades noolefunktsiooni

Ülesanne 

Erinevad funktsioonid

function minuNimi() {
    console.log("Minu nimi on Juhan");
}
minuNimi();


const minuNimiNool = () => console.log("Minu nimi on Juhan");
minuNimiNool();

Argumendiga funktsioon

function kuupaevEesti(kuupaev) {
    const kuud = [
        "jaanuar", "veebruar", "märts", "aprill", "mai", "juuni",
        "juuli", "august", "september", "oktoober", "november", "detsember"
    ];

    const osad = kuupaev.split(".");
    const paev = osad[0];
    const kuu = parseInt(osad[1]) - 1;
    const aasta = "20" + osad[2];

    console.log(`${paev}. ${kuud[kuu]} ${aasta}`);
}

kuupaevEesti("19.07.23"); 

Teadmata hulk

//3
function arvutaKeskmine(arvud) {
    let summa = 0;

    arvud.forEach(function(arv) {
        summa += arv;
    });

    let keskmine = summa / arvud.length;

    console.log(`Koguarv: ${summa}, Keskmine: ${keskmine}`);
}

arvutaKeskmine([3, 5, 7, 9]);

Salajane sõnum

//4
const salajaneSonum = (sonum) => {
    let uusSonum = "";
    const taishaalikud = ["a", "e", "i", "o", "u", "õ", "ä", "ö", "ü",
        "A", "E", "I", "O", "U", "Õ", "Ä", "Ö", "Ü"];

    for (let i = 0; i < sonum.length; i++) {
        let taht = sonum[i];
        let onTaishaalik = false;

        taishaalikud.forEach(function(h) {
            if (taht == h) {
                onTaishaalik = true;
            }
        });

        if (onTaishaalik) {
            uusSonum += "*";
        } else {
            uusSonum += taht;
        }
    }

    return uusSonum;
};

console.log(salajaneSonum("Nastja kasutab chat gpt"));

Unikaalsed nimed

//5

const leiaUnikaalsedNimed = (nimed) => {
    const unikaalsed = [];

    nimed.forEach(function(nimi) {
        let olemas = false;

        for (let i = 0; i < unikaalsed.length; i++) {
            if (unikaalsed[i] == nimi) {
                olemas = true;
            }
        }

        if (!olemas) {
            unikaalsed.push(nimi);
        }
    });

    return unikaalsed;
};

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