Files
2025-08-29 01:31:41 +00:00

210 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "92e136090efc4341b1d51c37924c1802",
"translation_date": "2025-08-29T00:42:38+00:00",
"source_file": "2-js-basics/2-functions-methods/README.md",
"language_code": "fi"
}
-->
# JavaScriptin perusteet: Metodit ja funktiot
![JavaScript Basics - Functions](../../../../translated_images/webdev101-js-functions.be049c4726e94f8b7605c36330ac42eeb5cd8ed02bcdd60fdac778174d6cb865.fi.png)
> Sketchnote: [Tomomi Imura](https://twitter.com/girlie_mac)
## Ennakkokysely
[Ennakkokysely](https://ff-quizzes.netlify.app)
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**.
[![Metodit ja funktiot](https://img.youtube.com/vi/XgKsD6Zwvlc/0.jpg)](https://youtube.com/watch?v=XgKsD6Zwvlc "Metodit ja funktiot")
> đŸŽ„ Klikkaa yllĂ€ olevaa kuvaa nĂ€hdĂ€ksesi videon metodeista ja funktioista.
> Voit kÀydÀ tÀmÀn oppitunnin lÀpi [Microsoft Learnissa](https://docs.microsoft.com/learn/modules/web-development-101-functions/?WT.mc_id=academic-77807-sagibbon)!
## 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À:
```javascript
function nameOfFunction() { // function definition
// function definition/body
}
```
Jos haluaisin luoda funktion, joka nÀyttÀÀ tervehdyksen, se voisi nÀyttÀÀ tÀltÀ:
```javascript
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.
```javascript
// 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Àmme `console`), 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À:
```javascript
function name(param, param2, param3) {
}
```
Voimme pÀivittÀÀ `displayGreeting`-funktion hyvÀksymÀÀn nimen ja nÀyttÀmÀÀn sen.
```javascript
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À.
```javascript
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:
```javascript
function displayGreeting(name, salutation='Hello') {
console.log(`${salutation}, ${name}`);
}
```
Kun kutsumme funktiota, voimme pÀÀttÀÀ, haluammeko mÀÀrittÀÀ arvon `salutation`-parametrille.
```javascript
displayGreeting('Christopher');
// displays "Hello, Christopher"
displayGreeting('Christopher', 'Hi');
// displays "Hi, Christopher"
```
## Paluuarvot
TÀhÀn asti rakentamamme funktio tulostaa aina [konsoliin](https://developer.mozilla.org/docs/Web/API/console). 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À:
```javascript
return myVariable;
```
Voisimme luoda funktion, joka luo tervehdyksen ja palauttaa arvon kutsujalle.
```javascript
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'`).
```javascript
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](https://developer.mozilla.org/docs/Web/API/WindowOrWorkerGlobalScope/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**.
```javascript
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:
```javascript
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:
```javascript
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
[JĂ€lkikysely](https://ff-quizzes.netlify.app)
## Kertaus ja itseopiskelu
Kannattaa [lukea lisÀÀ arrow-funktioista](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions), 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À
[Hauskaa funktioiden parissa](assignment.md)
---
**Vastuuvapauslauseke**:
TÀmÀ asiakirja on kÀÀnnetty kÀyttÀmÀllÀ tekoÀlypohjaista kÀÀnnöspalvelua [Co-op Translator](https://github.com/Azure/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.