10 KiB
JavaScriptin perusteet: Metodit ja funktiot
Sketchnote: Tomomi Imura
Ennakkokysely
Kun ajattelemme koodin kirjoittamista, haluamme aina varmistaa, ettÀ koodi on luettavaa. Vaikka tÀmÀ kuulostaa vastoin intuitiota, koodia luetaan paljon useammin kuin sitÀ kirjoitetaan. Yksi keskeinen työkalu kehittÀjÀn työkalupakissa yllÀpidettÀvÀn koodin varmistamiseksi on funktio.
đ„ Klikkaa yllĂ€ olevaa kuvaa nĂ€hdĂ€ksesi videon metodeista ja funktioista.
Voit kÀydÀ tÀmÀn oppitunnin lÀpi Microsoft Learnissa!
Funktiot
Funktio on pohjimmiltaan koodilohko, jonka voimme suorittaa tarpeen mukaan. TĂ€mĂ€ on tĂ€ydellinen ratkaisu tilanteisiin, joissa meidĂ€n tĂ€ytyy suorittaa sama tehtĂ€vĂ€ useita kertoja; sen sijaan, ettĂ€ kopioisimme logiikan useisiin paikkoihin (mikĂ€ tekisi pĂ€ivityksistĂ€ hankalia), voimme keskittÀÀ sen yhteen paikkaan ja kutsua sitĂ€ aina tarvittaessa â voit jopa kutsua funktioita toisista funktioista!
YhtÀ tÀrkeÀÀ on antaa funktiolle nimi. Vaikka tÀmÀ saattaa tuntua vÀhÀpÀtöiseltÀ, nimi toimii nopeana tapana dokumentoida koodin osa. Voit ajatella sitÀ kuin painikkeen etikettinÀ. Jos painikkeessa lukee "Peruuta ajastin", tiedÀn sen pysÀyttÀvÀn kellon.
Funktion luominen ja kutsuminen
Funktion syntaksi nÀyttÀÀ tÀltÀ:
function nameOfFunction() { // function definition
// function definition/body
}
Jos haluaisin luoda funktion, joka nÀyttÀÀ tervehdyksen, se voisi nÀyttÀÀ tÀltÀ:
function displayGreeting() {
console.log('Hello, world!');
}
Aina kun haluamme kutsua (tai suorittaa) funktiomme, kÀytÀmme funktion nimeÀ ja sen perÀssÀ ()
. On hyvÀ huomata, ettÀ funktiomme voidaan mÀÀritellÀ ennen tai jÀlkeen sen kutsumisen; JavaScript-kÀÀntÀjÀ löytÀÀ sen puolestasi.
// calling our function
displayGreeting();
NOTE: On olemassa erityinen funktiotyyppi, jota kutsutaan metodiksi, ja olet jo kÀyttÀnyt niitÀ! Itse asiassa nÀimme tÀmÀn esimerkissÀmme, kun kÀytimme
console.log
:ia. Se, mikÀ erottaa metodin funktiosta, on se, ettÀ metodi on liitetty objektiin (esimerkissÀmmeconsole
), kun taas funktio on irrallinen. Monet kehittÀjÀt kÀyttÀvÀt nÀitÀ termejÀ kuitenkin keskenÀÀn.
Funktion parhaat kÀytÀnnöt
Kun luot funktioita, pidÀ mielessÀsi muutama hyvÀ kÀytÀntö:
- KÀytÀ aina kuvailevia nimiÀ, jotta tiedÀt, mitÀ funktio tekee
- KÀytÀ camelCase-muotoilua yhdistÀÀksesi sanoja
- PidÀ funktiot keskittyneinÀ yhteen tiettyyn tehtÀvÀÀn
Tiedon vÀlittÀminen funktiolle
Jotta funktio olisi monikÀyttöisempi, haluat usein vÀlittÀÀ sille tietoa. Jos tarkastelemme yllÀ olevaa displayGreeting
-esimerkkiÀ, se nÀyttÀÀ aina Hello, world!. Ei kovin hyödyllinen funktio. Jos haluamme tehdÀ siitÀ hieman joustavamman, kuten antaa jonkun mÀÀrittÀÀ tervehdyksen kohteen nimen, voimme lisÀtÀ parametrin. Parametri (jota kutsutaan joskus myös argumentiksi) on lisÀtieto, joka lÀhetetÀÀn funktiolle.
Parametrit luetellaan mÀÀrittelyosassa sulkujen sisÀllÀ ja erotetaan pilkulla, kuten tÀssÀ:
function name(param, param2, param3) {
}
Voimme pÀivittÀÀ displayGreeting
-funktion hyvÀksymÀÀn nimen ja nÀyttÀmÀÀn sen.
function displayGreeting(name) {
const message = `Hello, ${name}!`;
console.log(message);
}
Kun haluamme kutsua funktiomme ja vÀlittÀÀ sille parametrin, mÀÀritÀmme sen sulkujen sisÀllÀ.
displayGreeting('Christopher');
// displays "Hello, Christopher!" when run
Oletusarvot
Voimme tehdĂ€ funktiostamme vielĂ€ joustavamman lisÀÀmĂ€llĂ€ enemmĂ€n parametreja. Mutta entĂ€ jos emme halua vaatia kaikkien arvojen mÀÀrittĂ€mistĂ€? Pysyen tervehdyksen esimerkissĂ€, voisimme jĂ€ttÀÀ nimen pakolliseksi (meidĂ€n tĂ€ytyy tietÀÀ, ketĂ€ tervehdimme), mutta haluamme sallia tervehdyksen mukauttamisen haluttaessa. Jos joku ei halua mukauttaa sitĂ€, tarjoamme oletusarvon. Oletusarvon mÀÀrittĂ€miseksi parametrille asetamme sen samalla tavalla kuin muuttujalle â parameterName = 'defaultValue'
. TÀssÀ on tÀydellinen esimerkki:
function displayGreeting(name, salutation='Hello') {
console.log(`${salutation}, ${name}`);
}
Kun kutsumme funktiota, voimme pÀÀttÀÀ, haluammeko mÀÀrittÀÀ arvon salutation
-parametrille.
displayGreeting('Christopher');
// displays "Hello, Christopher"
displayGreeting('Christopher', 'Hi');
// displays "Hi, Christopher"
Paluuarvot
TÀhÀn asti rakentamamme funktio tulostaa aina konsoliin. Joskus tÀmÀ voi olla juuri sitÀ, mitÀ haluamme, erityisesti kun luomme funktioita, jotka kutsuvat muita palveluita. Mutta entÀ jos haluan luoda apufunktion suorittamaan laskutoimituksen ja palauttamaan arvon, jotta voin kÀyttÀÀ sitÀ muualla?
TÀmÀ onnistuu kÀyttÀmÀllÀ paluuarvoa. Paluuarvo palautetaan funktiosta ja voidaan tallentaa muuttujaan samalla tavalla kuin voisimme tallentaa esimerkiksi merkkijonon tai numeron.
Jos funktio palauttaa jotain, kÀytetÀÀn avainsanaa return
. return
-avainsana odottaa arvoa tai viittausta siihen, mitÀ palautetaan, kuten tÀssÀ:
return myVariable;
Voisimme luoda funktion, joka luo tervehdyksen ja palauttaa arvon kutsujalle.
function createGreetingMessage(name) {
const message = `Hello, ${name}`;
return message;
}
Kun kutsumme tÀtÀ funktiota, tallennamme arvon muuttujaan. TÀmÀ on hyvin samanlaista kuin jos mÀÀrittÀisimme muuttujan staattiselle arvolle (kuten const name = 'Christopher'
).
const greetingMessage = createGreetingMessage('Christopher');
Funktiot funktioiden parametreina
Kun etenet ohjelmointitaidoissasi, törmÀÀt funktioihin, jotka hyvÀksyvÀt funktioita parametreina. TÀmÀ kÀtevÀ temppu on yleinen, kun emme tiedÀ, milloin jokin tapahtuu tai valmistuu, mutta tiedÀmme, ettÀ meidÀn tÀytyy suorittaa jokin toiminto vastauksena.
Esimerkiksi setTimeout aloittaa ajastimen ja suorittaa koodin, kun se pÀÀttyy. MeidÀn tÀytyy kertoa sille, mitÀ koodia haluamme suorittaa. Kuulostaa tÀydelliseltÀ tehtÀvÀltÀ funktiolle!
Jos suoritat alla olevan koodin, 3 sekunnin kuluttua nÀet viestin 3 sekuntia kulunut.
function displayDone() {
console.log('3 seconds has elapsed');
}
// timer value is in milliseconds
setTimeout(displayDone, 3000);
NimettömÀt funktiot
Katsotaanpa uudelleen, mitÀ olemme rakentaneet. Luomme funktion, jolla on nimi, mutta jota kÀytetÀÀn vain kerran. Kun sovelluksemme monimutkaistuu, voimme huomata luovamme paljon funktioita, joita kutsutaan vain kerran. TÀmÀ ei ole ihanteellista. Kuten kÀy ilmi, meidÀn ei aina tarvitse antaa funktiolle nimeÀ!
Kun vÀlitÀmme funktion parametrina, voimme ohittaa sen etukÀteen luomisen ja sen sijaan rakentaa sen osana parametria. KÀytÀmme samaa function
-avainsanaa, mutta rakennamme sen parametrina.
Kirjoitetaan yllÀ oleva koodi uudelleen kÀyttÀmÀllÀ nimetöntÀ funktiota:
setTimeout(function() {
console.log('3 seconds has elapsed');
}, 3000);
Jos suoritat uuden koodimme, huomaat saavasi samat tulokset. Olemme luoneet funktion, mutta emme joutuneet antamaan sille nimeÀ!
Fat arrow -funktiot
Yksi yleinen oikotie monissa ohjelmointikielissÀ (mukaan lukien JavaScript) on mahdollisuus kÀyttÀÀ niin sanottua arrow- tai fat arrow -funktiota. Se kÀyttÀÀ erityistÀ merkintÀÀ =>
, joka nĂ€yttÀÀ nuolelta â tĂ€stĂ€ nimi! KĂ€yttĂ€mĂ€llĂ€ =>
voimme ohittaa function
-avainsanan.
Kirjoitetaan koodi vielÀ kerran uudelleen kÀyttÀmÀllÀ fat arrow -funktiota:
setTimeout(() => {
console.log('3 seconds has elapsed');
}, 3000);
Milloin kÀyttÀÀ mitÀkin strategiaa
Olet nyt nÀhnyt kolme tapaa vÀlittÀÀ funktio parametrina ja saatat miettiÀ, milloin kÀyttÀÀ mitÀkin. Jos tiedÀt, ettÀ kÀytÀt funktiota useammin kuin kerran, luo se normaalisti. Jos kÀytÀt sitÀ vain yhdessÀ paikassa, on yleensÀ parasta kÀyttÀÀ nimetöntÀ funktiota. Se, kÀytÀtkö fat arrow -funktiota vai perinteisempÀÀ function
-syntaksia, on makuasia, mutta huomaat, ettÀ useimmat modernit kehittÀjÀt suosivat =>
.
đ Haaste
Osaatko selittÀÀ yhdessÀ lauseessa, mikÀ ero on funktioiden ja metodien vÀlillÀ? Kokeile!
JĂ€lkikysely
Kertaus ja itseopiskelu
Kannattaa lukea lisÀÀ arrow-funktioista, sillÀ niitÀ kÀytetÀÀn yhÀ enemmÀn koodipohjissa. Harjoittele funktion kirjoittamista ja kirjoita se sitten uudelleen kÀyttÀen tÀtÀ syntaksia.
TehtÀvÀ
Vastuuvapauslauseke:
TÀmÀ asiakirja on kÀÀnnetty kÀyttÀmÀllÀ tekoÀlypohjaista kÀÀnnöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, ettÀ automaattiset kÀÀnnökset voivat sisÀltÀÀ virheitÀ tai epÀtarkkuuksia. AlkuperÀistÀ asiakirjaa sen alkuperÀisellÀ kielellÀ tulee pitÀÀ ensisijaisena lÀhteenÀ. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskÀÀntÀmistÀ. Emme ole vastuussa tÀmÀn kÀÀnnöksen kÀytöstÀ aiheutuvista vÀÀrinkÀsityksistÀ tai virhetulkinnoista.