mirror of
https://github.com/microsoft/Web-Dev-For-Beginners.git
synced 2025-09-24 21:41:37 +02:00
210 lines
10 KiB
Markdown
210 lines
10 KiB
Markdown
<!--
|
||
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
|
||
|
||

|
||
> 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**.
|
||
|
||
[](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. |