Osa 5 - Funktiot

Ankka halusi leipoa kakun. Ankan pieni pää ei kuitenkaan muistanut miten se tehdään. Onneksi joku oli kirjoittanut siitä ohjeet ylös! Ankka haki tuon ohjeen joka kerta, kun se halusi tehdä kakun.

Funktio eli aliohjelma on koodin osa, joka voidaan suorittaa tarvittaessa. Funktion koodia ei siis suoriteta heti. Olemme jo nähneet funktioita osassa 3, jossa tutustuttiin tapahtumakäsittelijöihin. Ne nimittäin ovat funktioita.

Funktioita käytetään javascriptissä monilla eri tavoilla ja ne voivat näyttää erilaisilta. Yleisesti ottaen funktiot voidaan jakaa kahteen luokkaan: nuolifunktoihin, jotka tunnistaa nuolesta =>, ja avainsanafunktioihin, jotka tunnistaa avainsanasta function.

Alla on esimerkkejä funktiosta, joihin tutustutaan tässä luvussa.

// Tapahtumakäsittelijä:

teksti.onclick = () => {
    alert("Hei siellä!")
}

// Ajastin:

setTimeout(() => {
    alert("Yllätys!")
}, 5000)

// Toistettu funktio:

setInterval(() => {
    alert("Hei taas!")
}, 5000)

// Nimetty funktio:

function liikutaYlös() {
    hahmo.y -= 1
}

// Piirtofunktio:

function piirrä() {
    piirtäjä.clearRect(0, 0, 300, 150)    
    piirtäjä.fillRect(hahmo.x, hahmo.y, 10, 10)

    requestAnimationFrame(piirrä)
}
requestAnimationFrame(piirrä)

Tapahtumäkäsittelijät – kertaus

Tapahtumankäsittelijöihin tutustuttiin jo kolmannessa luvussa. Ne ovat funktioita, jotka suoritetaan kun ennalta määritetty tapahtuma tapahtuu. Esimerkiksi napin painaminen ja hiiren liikuttaminen ovat tapahtumia.

Esimerkki

Tapahtumakäsittelijä näyttää ilmoituksen, kun tekstiä klikataan.

Tehtävä

Lisää painikkeelle kuuntelija. Kun painiketta klikataan, niin tulosta alert()> komennolla "Klikkasit painiketta."

Tehtävä

Täydennä ohjelmaa niin, että kun käyttäjä painaa näppäintä "a", niin tulostuu alert() komennolla "Ankka aivasti avaruudessa."

Tehtävä

Täydennä ohjelmaa niin, että kun käyttäjä klikkaa painiketta, niin neliön väri vaihtuu punaiseksi. Neliön väri vaihtuu, kun piirrät sen päälle uuden neliön, joka on erivärinen.

Ajastimet

Esimerkki

Ajastettu funktio, joka suoritetaan 3 sekunnin kuluttua.

Ajastettu funktio suoritetaan, kun ohjelman käynnistämisestä on kulunut määritellyn verran aikaa. Esimerkiksi jos ohjelman halutaan tulostavan viiden sekunnin kuluttua suorituksen aloittamisesta alert("Yllätys!"), niin ajastettu funktio eli setTimeout funktio näyttää seuraavalta

setTimeout(() => {
    alert("Yllätys!")
}, 5000)

Ajastettu funktio saattaa näyttää hieman hämmentävältä. Siinä on kuitenkin havaittavissa nuoli =>, kuten tapahtumankäsittelijässä. Tutkitaan miten funktio kirjoitetaan. Aluksi aloitetaan funktion nimellä, joka on setTimeout. Lisätään nimen perään sulut, jolloin saamme funktion näyttämään seuraavalta

setTimeout()

Tämä näyttää tavalliselta komennolta. Kirjoitetaan sulkujen sisälle nuolifunktio () => { }.

setTimeout(() => { })

Kirjoitusasu on hieman epäselvä, joten lisätään aaltosulkeiden { } sisälle tyhjärivi. Tyhjän rivin saa painamalla kaksi kertaa Enter-näppäintä aaltosulkeiden sisällä.

setTimeout(() => { 

})

Aaltosulkeiden sisälle kirjoitetaan myös komento tai komennot, jotka halutaan suorittaa, kun ajastimen aika on kulunut. Kirjoitetaan aaltosulkeiden sisään komento alert("Yllätys!"), jolloin ohjelma tulostaa “Yllätys!”.

setTimeout(() => { 
  alert("Yllätys!")
})

setTimeout-funktiolle ei ole vielä määritelty aikaa, jonka jälkeen alert()-komento tapahtuu. Lisätään viimeisen aaltosulkeen jälkeen pilkku ja aika. Aika määritetään millisekuntteina. Tämä tarkoittaa, että esimerkin 5000 tarkoittaa viittä tuhatta millisekunttia, joka on yhtäsuurta kuin viisi sekunttia.

setTimeout(() => { 
  alert("Yllätys!")
}, 5000)

Tämä funktio siis tulostaa viiden sekunin kuluttua ohjelman käynnistymisestä näytölle tekstin Yllätys!.

Tehtävä

Tee ajastettu funktio, joka tulostaa 2 sekunnin kuluttua näytölle prompt() kysymyksen "Yllätyitkö?" Talleta vastaus muuttujaan, jonka nimi on "vastaus". Tulosta prompt() komennon jälkeen alert() komennolla käyttäjän vastaus.

Tehtävä

Tee ohjelma, joka vaihtaa neliön väriä kahden sekunnin kuluttua keltaiseksi. Muista, että neliön väri vaihtuu, kun sen päälle piirretään uusi eri värinen neliö.

Ajastetun funktion voi laittaa tapahtumakäsittelijän sisälle, jolloin se suoritetaan tietyn ajan kuluttua tapahtumasta:

Esimerkki

Ajastettu funktio tapahtumakäsittelijän sisällä. Mitä tapahtuu, jos klikkaat tekstiä uudestaan ennen viestin ilmestymistä?

5.3 Toistetut funktiot

Esimerkki

Toistettu funktio, joka lisää rivejä tekstiin. Komento .textContent += lisää loppuun uutta tekstiä.

Toistettu funktio suoritetaan loputtomasti tietyllä tahdilla. Toistetun funktion kutsuminen näyttää aivan ajastetun funktion kutsulta, mutta siinä käytetään setInterval-komentoa.

setInterval(() => {
	
}, 1000)

Toistetussa funktiossa suoritettava koodi menee tuttuun tapaan aaltosulkeiden sisälle, viimeisen aaltosulkeen jälkeen on pilkku ja pilkun jälkeen määritetään, kuinka usein funktio toistetaan. Esimerkiksi 1000 ms = 1 s, joten esimerkissä olevaa funktiota toistetaan yhden sekunnin välein.

Tehtävä

Tee ohjelma, joka lisää sivulle 3,5 sekunnin välein tekstin "Pöö!". Käytä setInterval funktiota.

Miten toistetun funktion saa loppumaan?

Toistetun funktion saa loppumaan käyttämällä komentoa clearInterval. Komennolle pitää antaa parametrina toistettu funktio. Tämä tarkoittaa sitä, että toistettu funktio pitää nimetä jotenkin. Talletetaan siis toistettu funktio muuttujaan.
Lisätään clearInterval komento siten, että painiketta klikatessa tekstin lisääminen loppuu.

5.4 Nimetyt funktiot

Esimerkki

Nimetty funktio, joka suoritetaan heti, 5 s kuluttua ja kun tekstiä painetaan.

Ajastimet, toistetut funktiot ja tapahtumankäsittelijät suoritetaan automaattisesti silloin, kun jotain tapahtuu, tai tietyn ajan päästä. Nimetty funktio eroaa näistä funktioista siten, että koodissa pitää kutsua funktiota, jotta se suoritetaan. Jotta voisimme kutsua funktiota, täytyy sille antaa nimi, jolla funktiota kutsutaan. Siksi kutsumme tämän tyyppisiä funktioita nimetyiksi funktioiksi. Nimetyn funktion rakenne on seuraava

function funktionNimi() {
    
}

Ensin kirjoitetaan avainsana function, josta tunnistetaan, että kysessä on funktio. Tämän jälkeen kirjoitetaan funktion nimi. Esimerkissä funktion nimi on funktionNimi, mutta se voi olla mitä ohjelmoija päättää keksiä. Funktion nimen jälkeen kijroitetaan sulut, jonka jälkeen kirjoitetaan aaltosulut. Aaltosulkeiden sisään tulee koodi, joka suoritetaan funktiota kutsuttaessa. Nimetyt funktiot ovat kuten muuttujia, mutta niillä voidaan tehdä paljon enemmän asioita

Funktioita käytetään, jotta koodia ei tarvitsisi kirjoittaa joka kerta uudestaan. Niiden avulla voimme uusio käyttää tiettyä toiminnallisuutta useita kertoja.

Esimerkki

Jokaisen painikkeen painaminen kutsuu samaa funktiota, jonka nimi on "tervehdi().

Kysymyksiä